Sql-Server
查詢日期範圍
我查詢這個 SQL 查詢:
SELECT * FROM [DB].[dbo].[Table] WHERE [DATE] BETWEEN '01-01-2016' AND '31-03-2016' AND ([TIME] >= '00:00:00' OR [DATE] > '01-01-2016') AND ([TIME] <= '00:00:00' OR [DATE] < '31-03-2016');
但在 SQL Studio 中,結果是另一個日期和時間。
[DATE] = VARCHAR(10) (DD-MM-YYYY) [TIME] = VARCHAR(10) (HH:MM:SS) 24h
怎麼修 ?
優先級1:修復表。您不應該將日期和時間數據儲存在
varchar
列中,並且很可能不應該將日期和時間分隔到它們自己單獨的列中。您還應該避免將保留字/關鍵字作為列,但我懷疑您可能只是簡化了實際的表結構。優先級 2:停止使用 BETWEEN。這可能會導致各種問題,特別是如果您修復表格並將日期和時間合併到單個列中。範圍的結尾因數據類型而異,但使用 >= 範圍的開頭和 < 的 NEXT 範圍的開頭將始終有效。考慮到表格已更改,您可以說如下(我不確定您要對第二個和第三個 where 子句做什麼,但您應該只能查看日期列):
WHERE [DATE] >= '20160101' AND [DATE] < '20160401'; -- note that I don't have to look at the TIME column at all -- also note that I use a *SAFE* format for the string literal
優先級 3:停止將日期作為字元串進行比較。如果您無法修復表格,那麼您的子句需要首先將字元串列轉換為有效的日期/時間值,因此您無需比較字元串。並且您需要使用在 SQL Server中安全的字元串格式;
dd-mm-yyyy
不是其中一種格式 - 例如,如果您更改語言設置,它可能會中斷(或只是返回錯誤的數據)。WHERE CONVERT(datetime, [DATE], 105) >= '20160101' AND CONVERT(datetime, [DATE], 105) < '20160401'; -- 103 makes sure the stored strings are interpreted as d/m/y
補充閱讀: