Sql-Server

查詢日期範圍

  • May 7, 2020

我查詢這個 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] &gt;= '20160101'
 AND [DATE] &lt;  '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) &gt;= '20160101' 
 AND CONVERT(datetime, [DATE], 105) &lt;  '20160401';
-- 103 makes sure the stored strings are interpreted as d/m/y

補充閱讀:

引用自:https://dba.stackexchange.com/questions/139650