4

在 SQL Sever 中转换为在谓词中使用的最佳短日期是什么。

我有一个日期2013-06-11 15:06:27.000,想2013-06-11在谓词中使用短日期部分。

为此目的,在 SQL Server 中转换为的最佳短日期是什么?

MSDN - 日期转换

4

5 回答 5

5
Select Convert(DateTime, Convert(VarChar, GetDate(), 12))
于 2013-07-24T07:12:18.660 回答
4

如果您使用的是 sqlserver 2008+,则不是那么难

cast(@date as date)

或者

convert(date, @date)

由于您使用的是 sqlserver 2005

CONVERT(CHAR(10), @date, 121)

但是,如果您要与另一个日期进行比较,请保留日期时间格式并删除时间部分:

dateadd(day, 0, datediff(day, 0, @date))
于 2013-07-24T07:07:10.330 回答
1

那这个呢?

SELECT CONVERT(CHAR(12),GETDATE(),12)
于 2013-07-24T07:09:01.910 回答
1

如果您使用的是 2008 年之前的 SQL Server 版本,那么我将使用以下方法:

SELECT DateAdd(dd, DateDiff(dd, 0, Current_Timestamp), 0);

我之所以选择这种方法而不是其他建议的方法是它避免了转换为字符数据类型(和返回)。

您也可以选择将此方法用于 2008 年之后的版本(包括 2008 年),具体取决于您打算对此值执行的操作...如果您要将其与另一个datetime值进行比较,那么此方法至少会保留相同的数据类型进行比较。如果要与一个date值进行比较,则使用上述SELECT Cast(Current_Timestamp As date);

于 2013-07-24T07:32:08.933 回答
1

对于 SQL2005+:

注意: Select Convert(DateTime, Convert(VarChar, DateTimeColumn, 12)) <operator> <const>不能SARG!因此,如果您有索引,DateTimeColumn则 SQL Server 无法Index Seek在此列上查找 ()。相反,SQL Server 将使用Index Scan,Clustered Index ScanTable Scan.

如果要过滤列上的行,DATETIME可以使用DateTimeColumn >= RangeStart AND DateTimeColumn < RangeEndDateTimeColumn BETWEEN RangeStart AND RangeEnd谓词。

怎么能生成RangeStartRangeEnd

    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))
于 2013-07-24T07:42:18.780 回答