2010-09-30 77 views
3

我有這樣一個簡單的問題,我覺得很蠢。我不敢相信我在這件事上碰到了我的頭。在SQL Server 2005中按日期/時間查詢

我有一個名爲「訂單」的表。 「訂單」有一個名爲「DateOrdered」的小日期時間字段。我需要在特定日期獲得所有「訂單」。我試過以下沒有任何成功:

SELECT * FROM Orders WHERE [DateOrdered]=2010-06-01 

SELECT * FROM Orders WHERE [DateOrdered]='2010-06-01' 

SELECT * FROM Orders WHERE [DateOrdered]=CAST('2010-06-01' AS smalldatetime) 

我在做什麼錯?我不相信我甚至會問這個問題。

回答

3

第一個查詢將日期與編號爲2003(2010減6減1)的日期進行比較,該日期轉換爲日期'1905-06-27'。第二個和第三個查詢將對確切的日期值(即00:00時間分量)起作用,並且是等同的。

在smalldatetime值中是否有時間組件?在這種情況下,你可以在一個區間得到的值:

SELECT * FROM Orders WHERE DateOrdered >= '2010-06-01' 
         and DateOrdered < '2010-06-02' 

注意使用>=<代替between關鍵字,以排除可能具有精確值2010-06-02任何記錄。

+0

我的解決方案可能會更加靈活,而不是使用1天,但我想這取決於他如何執行SQL – hunter 2010-09-30 17:50:23

2

與此類似,也注意安全ISO日期格式(年月日),這將不會炸燬如果你是在以英國爲例

SELECT * FROM Orders WHERE [DateOrdered] >='20100601' 
AND [DateOrdered] < '20100602' 

這樣也將使你使用一個索引,如果你投的DateOrdered列的索引將不會被使用

這裏是當你使用YYYY-MM-DD,而不是YYYYMMDD

會發生什麼情況爲例
SET LANGUAGE 'us_english' 

SELECT CONVERT(DATETIME, '2006-04-06'), --will be YMD 
     CONVERT(DATETIME, '20060406') --safe format 

SET LANGUAGE 'Italian' 

SELECT CONVERT(DATETIME, '2006-04-06'), --will be YDM 
     CONVERT(DATETIME, '20060406') -- safe format 
1

我建議你使用DATEDIFF

SELECT * FROM Orders WHERE DATEDIFF(d, [DateOrdered], '20100601') = 0