2013-02-28 110 views
2

我有以下簡單的查詢麻煩SQL Server日期時間和SQL

SELECT * FROM users WHERE Created = '28/02/2013' 

問題是列CREATEDdatetime數據類型,所以查詢,只要時間戳是0:00執行罰款: 0,如果時間戳設置爲12:00,那麼查詢不會返回結果集。

任何想法爲什麼?

感謝

+1

http://www.xkcd.com/1179/ – 2013-02-28 14:21:58

回答

1
SELECT * FROM users WHERE CAST(Created AS DATE) = '28/02/2013' 

將修復它,但要小心,它禁用索引

SELECT * FROM users WHERE Created BETWEEN '28/02/2013 00:00' AND '28/02/2013 23:59' 

,這將使用指數

+0

如果時間部分很重要,您不應該使用'BETWEEN'。 59:有像''20130228 23值會發生什麼59'',他們將得到過濾掉 – Lamak 2013-02-28 15:30:10

+0

如果需要的話太 – Sergio 2013-03-01 06:11:29

-1

您必須將列轉換爲日期,然後比較

SELECT * FROM users WHERE CONVERT(VARCHAR(11), Created, 106) = '28 Feb 2013' 
+0

SELECT * FROM用戶WHERE轉換(VARCHAR(20這只是一個例子,肯定可以指定秒),一.time_inserted,101)='02/28/2013' – Satya 2013-02-28 14:22:27

+1

此解決方案的風險在於您正在進行字符串比較而不是日期比較。所以,你必須小心地匹配日期格式。 – bobs 2013-02-28 14:28:23

4

因爲你沒有指定時間,所以它假設你正在做的:

SELECT * FROM users WHERE Created = '28/02/2013 00:00:00' 

如果你想了整整一天,那麼你需要的時間範圍內:

SELECT * 
FROM users 
WHERE Created >= '20130228' AND Created < '20130301' 

另外,請用日期格式不明確('YYYYMMDD'),而不是其他格式。

+0

當然,你的意思是ISO 8601標準( 「YYYY-MM-DD」)... – 2013-02-28 14:25:03

+1

@DavidB不,我的意思''爲SQL Server YYYYMMDD''自也不含糊對RDBMS(datetime和date的數據類型)。 (儘管'YYYY-MM-DD'對於DATE數據類型也不是不明確的)。 – Lamak 2013-02-28 14:30:18

+2

@DavidB:SQL Server對「DATETIME」的「ISO-8601」的解釋確實是** only **'YYYYMMDD'(** no破折號!**)。使用破折號 - 這將是「正常的」ISO-8601標準**對所有語言設置都不起作用** - 它**可以(並且將)例如失敗。 「德語」或「英國英國」(或幾乎任何歐洲語言)的語言設置... – 2013-02-28 15:43:59

1

如果你不需要考慮時間:嘗試created字段轉換date,然後比較結果爲;

SELECT * FROM users WHERE convert(date,Created) = '28/02/2013' 

--this would be even better with iso date format (not culture specific) 
SELECT * FROM users WHERE convert(date,Created) = '20130228' --yyyymmdd format