2011-05-24 62 views
1

目前我比較短日期是這樣的:有道比較短日期(SQL Server 2005中)

CONVERT(datetime,CONVERT(VARCHAR(10), return_date,101)) = '{0}' 

我的導師說我應該做這種方式:

datepart(month,return_date)= 5 
and datepart(day,return_date)=24 
and datepart(year,return_date)=2011 

因爲由函數CONVERT識別的定義值101可能在將來改變。真的嗎?這些參數值多久改變一次?過去有過改變嗎?是否有更好的方法來比較日期的簡短形式?

+0

如果你的兩個日期都在短日期型數據不需要轉換或日期部分。你可以比較一樣簡單:其中dt1 = dt2 – ibram 2011-05-24 17:59:43

+0

對不起,我應該指定我們比較具有時間分量的日期,因此只需要比較日期分量而不是時間 – enamrik 2011-05-24 18:34:07

回答

3

如果「短日期」你的意思是「不只是時間的日期」

Select ... 
From MyTable 
Where return_date >= '20110524' 
    And return_date < DateAdd(d, 1, '20110524') 

首先,請注意<在where子句中的第二部分。其次,如果return_date上有索引,則此方法將使用它。這將不利用索引(並且因此導致表掃描)另一解決方案是:

Select ... 
From MyTable 
Where DateAdd(d, DateDiff(d, 0, return_date), 0) = '20110524' 

如果return_date總是存儲沒有它的時間分量(即,它的時間分量總是午夜),則可以做一個簡單的比較:

​​
+0

感謝您的詳細解答。您是否也可以分享您的意見,以確定CONVERT函數的日期格式參數是否可能更改? – enamrik 2011-05-24 18:29:44

+0

@enamrik - 它可能不會改變,但這也不是比較日期的最佳方式。通過在列上執行一個函數,無論在return_date上是否有索引,都將強制進行表掃描。如果return_date中的值可以有時間分量,那麼我的第一個解決方案是最好的。如果return_date中的值永遠不會有時間分量,那麼我最後的解決方案是最好的。你不應該需要使用轉換。 – Thomas 2011-05-24 18:33:29

+0

@enamrik - 順便說一句,讓我補充一點,在SQL Server 2008中,有一個'Date'數據類型,它只存儲日期部分,並且應該消除這個剝離時間部分的問題。 – Thomas 2011-05-24 18:34:36

1

將轉換風格,convert()其轉換風格,因爲SQL服務器4.2,C並沒有改變之外。 1992年,當時它與OS/2捆綁在一起。

+0

+1同意。這將是一個重大的突破性改變。機會很渺茫。 – 2011-05-24 18:01:17

+0

謝謝,我正在尋找文檔來證明這一點。我等不及要告訴我的主管,我已經可以品嚐它了! – enamrik 2011-05-24 18:32:38

0

這是我的偏好:

SELECT foo 
FROM bar 
WHERE return_date = CONVERT(datetime, FLOOR(CONVERT(float, Getdate()))) 

,或者,如果返回的航班具有時間戳

SELECT foo 
FROM bar 
WHERE CONVERT(datetime, FLOOR(CONVERT(float, return_date))) = CONVERT(datetime, FLOOR(CONVERT(float, Getdate())))