SQL Server转换为最佳短日期

时间:2013-07-24 07:04:43

标签: sql sql-server tsql

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

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

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

MSDN - Date convert

5 个答案:

答案 0 :(得分:5)

Select Convert(DateTime, Convert(VarChar, GetDate(), 12))

答案 1 :(得分:4)

如果你使用的是sqlserver 2008 +

,那就不那么难了
cast(@date as date)

convert(date, @date)

因为您使用的是sqlserver 2005

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

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

dateadd(day, 0, datediff(day, 0, @date))

答案 2 :(得分:1)

这个怎么样?

SELECT CONVERT(CHAR(12),GETDATE(),12)

答案 3 :(得分:1)

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

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

我之所以选择这种方法的原因是它避免了转换为字符数据类型(并且返回)。

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

答案 4 :(得分:1)

对于SQL2005 +:

注意: Select Convert(DateTime, Convert(VarChar, DateTimeColumn, 12)) <operator> <const>不是SARG能够的!因此,如果您在DateTimeColumn上有索引,则SQL Server无法在此列上搜索(Index Seek)。相反,SQL Server将使用Index ScanClustered 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))