在 SQL Sever 中转换为在谓词中使用的最佳短日期是什么。
我有一个日期2013-06-11 15:06:27.000
,想2013-06-11
在谓词中使用短日期部分。
为此目的,在 SQL Server 中转换为的最佳短日期是什么?
在 SQL Sever 中转换为在谓词中使用的最佳短日期是什么。
我有一个日期2013-06-11 15:06:27.000
,想2013-06-11
在谓词中使用短日期部分。
为此目的,在 SQL Server 中转换为的最佳短日期是什么?
Select Convert(DateTime, Convert(VarChar, GetDate(), 12))
如果您使用的是 sqlserver 2008+,则不是那么难
cast(@date as date)
或者
convert(date, @date)
由于您使用的是 sqlserver 2005
CONVERT(CHAR(10), @date, 121)
但是,如果您要与另一个日期进行比较,请保留日期时间格式并删除时间部分:
dateadd(day, 0, datediff(day, 0, @date))
那这个呢?
SELECT CONVERT(CHAR(12),GETDATE(),12)
如果您使用的是 2008 年之前的 SQL Server 版本,那么我将使用以下方法:
SELECT DateAdd(dd, DateDiff(dd, 0, Current_Timestamp), 0);
我之所以选择这种方法而不是其他建议的方法是它避免了转换为字符数据类型(和返回)。
您也可以选择将此方法用于 2008 年之后的版本(包括 2008 年),具体取决于您打算对此值执行的操作...如果您要将其与另一个datetime
值进行比较,那么此方法至少会保留相同的数据类型进行比较。如果要与一个date
值进行比较,则使用上述SELECT Cast(Current_Timestamp As date);
对于 SQL2005+:
注意: Select Convert(DateTime, Convert(VarChar, DateTimeColumn, 12)) <operator> <const>
不能SARG
!因此,如果您有索引,DateTimeColumn
则 SQL Server 无法Index Seek
在此列上查找 ()。相反,SQL Server 将使用Index Scan
,Clustered Index Scan
或Table Scan
.
如果要过滤列上的行,DATETIME
可以使用DateTimeColumn >= RangeStart AND DateTimeColumn < RangeEnd
或DateTimeColumn BETWEEN RangeStart AND RangeEnd
谓词。
怎么能生成RangeStart
和RangeEnd
?
DECLARE @SelectedDate DATETIME;
SET @SelectedDate='2013-06-11 15:06:27.000';
SELECT DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate),0) AS Start,
DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0) AS [End 1],
DATEADD(MILLISECOND,-3,DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0)) AS [End 2]
注意 2:对于DATETIME
列,最后毫秒可以是其中之一{0,3,7}
(请参阅BOL)。
结果:
Start End 1 End 2
----------------------- ----------------------- -----------------------
2013-06-11 00:00:00.000 2013-06-12 00:00:00.000 2013-06-11 23:59:59.997
示例 #1:
...
WHERE h.OrderDate>=DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate),0)
AND h.OrderDate<DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0)
示例 #2:
...
WHERE h.OrderDate>=DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate),0)
AND h.OrderDate<=DATEADD(MILLISECOND,-3,DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0))
示例#3:
...
WHERE h.OrderDate BETWEEN DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate),0) AND DATEADD(MILLISECOND,-3,DATEADD(DAY,DATEDIFF(DAY,0,@SelectedDate)+1,0))