簡體   English   中英

將“日期”列與日期時間值進行比較

[英]Comparing a Date column with a datetime value

我在我們的stored procedures之一中找到以下查詢

SELECT *FROM TABLE1
WHERE (CONVERT(DATE,DateTo) BETWEEN @wkstdate AND @wkenddate))

由於where子句中的Functions用法可能會影響性能,因此我將其更改如下,

 SELECT *FROM TABLE1
 WHERE DateTo BETWEEN @wkstdate AND @wkenddate

更改代碼后的結果相同。 但是我不確定兩者是否始終會給出相同的結果。 以上代碼帶來不同結果的任何場景?

(PS:@wkstdate和@wkenddate是DATE值,而DateTo是DATETIME值)

感謝您的建議

這不會產生相同的結果。

假設您的DateToDATETIME值,具有時間成分:

'2015-09-21 01:00:00'

您的@wkenddate'2015-09-21' '2015-09-21 01:00:00' @wkenddate '2015-09-21 01:00:00' > @wkenddate以來WHERE DateTo BETWEEN @wkstdate AND @wkenddateWHERE DateTo BETWEEN @wkstdate AND @wkenddate將不會檢索上述行。

有關更多示例:

CREATE TABLE tbl(DateTo DATETIME)
INSERT INTO tbl 
    SELECT CAST('2015-09-21 00:00:00.000' AS DATETIME) UNION ALL
    SELECT CAST('2015-09-21 16:10:49.047' AS DATETIME) UNION ALL
    SELECT CAST('2015-09-22 16:10:49.047' AS DATETIME) UNION ALL
    SELECT CAST('2015-09-20 16:10:49.047' AS DATETIME) 

DECLARE  @wkstdate DATE = '20150921',
         @wkenddate DATE = '20150921'
SELECT * 
FROM tbl
WHERE DateTo BETWEEN @wkstdate AND @wkenddate

SELECT * FROM tbl
WHERE (CONVERT(DATE,DateTo) BETWEEN @wkstdate AND @wkenddate)


DROP TABLE tbl

現在,在WHERE子句中使用function確實會使查詢無法顯示,但是有一些例外。 其中之一是CAST ING DATE

如果您不想CASTDATE另一種選擇是不使用BETWEEN運算符。 而是使用>= and <

WHERE
    DateTo >= @wkstdate 
    AND DateTo < DATEADD(DAY, 1, @wkenddate)

BETWEEN運算符將無法正確處理日期數據上的Times。 因此,如果您有兩個日期1/1/20002/1/2000 ,然后要求BETWEEN2/1/2000 14:00類的日期時間上工作,則此日期時間不會介於它們之間。 建議從日期時間中刪除“時間”部分,如示例中所示,使用CONVERT函數可能是最好的方法。 還有其他方法可以剝離“時間”部分,但“ CONVERT可能是最有效的。 (我的示例使用dd/mm/yyyy格式)

關於存儲過程,我注意到的最不高效的事情是使用SELECT * FROM 嘗試使用顯式字段選擇-如果您想要更有效的存儲過程,則可以最大程度地減少SQL的負擔。

是的,兩者都會給出不同的結果。

假設wkStDate = 9/1/2015和wkEndDta = 9/30/2015

DateTo = 2015年9月1日18:00 HRS(兩種情況都將包括在內)

DateTo = 9/21/2105 18:00 HRS(兩種情況都將包括在內)

DateTo = 9/30/2105 18:00 HRS(將包含在原始查詢中,但不包含第二個查詢而未進行轉換)

換句話說,日期部分與結束日期相同且時間大於午夜的任何值都將不帶轉換功能的查詢排除在外,即WkEndDate + 00:00:01至WkEndDate + 23:59:59將被排除。 所有其他日期將顯示相同的結果。

如果您的DateTo是日期時間,並且除午夜以外沒有其他時間,則兩個查詢將給出相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM