簡體   English   中英

SQL Server轉換為最佳短日期

[英]SQL Server convert to optimal short date

在SQL Sever中轉換為在謂詞中使用的最佳短日期是什么。

我有一個日期2013-06-11 15:06:27.000並且想在謂詞中使用短日期部分2013-06-11

為此目的,在SQL Server中轉換為最佳短期日期是什么時候?

MSDN - 日期轉換

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之后的版本,具體取決於您打算對此值執行的操作...如果您要將其與另一個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 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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM