[英]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
值)
感謝您的建議
這不會產生相同的結果。
假設您的DateTo
是DATETIME
值,具有時間成分:
'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 @wkenddate
的WHERE 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
。
如果您不想CAST
到DATE
另一種選擇是不使用BETWEEN
運算符。 而是使用>= and <
:
WHERE
DateTo >= @wkstdate
AND DateTo < DATEADD(DAY, 1, @wkenddate)
BETWEEN
運算符將無法正確處理日期數據上的Times。 因此,如果您有兩個日期1/1/2000
和2/1/2000
,然后要求BETWEEN
在2/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.