将Date列与datetime值进行比较

时间:2015-09-21 08:11:33

标签: sql sql-server tsql

我在for(i= 0; i < question.length; i ++)/**** ; ****/ { question[i].style.display = "block"; }

中找到了以下查询
stored procedures

由于SELECT *FROM TABLE1 WHERE (CONVERT(DATE,DateTo) BETWEEN @wkstdate AND @wkenddate)) 条款中Functions的使用可能会影响我的表现,我已将其更改如下,

where

更改代码后结果相同。但我不确定两者是否会一直给出相同的结果。上述代码带来不同结果的任何情景?

  

(P.S:@wkstdate和@wkenddate是 SELECT *FROM TABLE1 WHERE DateTo BETWEEN @wkstdate AND @wkenddate 值&amp; DateTo是一个   DATE值)

感谢您的建议

3 个答案:

答案 0 :(得分:2)

这不会产生相同的结果。

让我们说DateToDATETIME值,有一个时间成分:

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

您的@wkenddate'2015-09-21'。自WHERE DateTo BETWEEN @wkstdate AND @wkenddate&gt; '2015-09-21 01:00:00'后,@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

现在,使用CAST子句中的函数确实使您的查询不具有SARGable,但也有例外。其中一个是CASTing to DATE

如果您不想DATEBETWEEN,另一种选择是不使用>= and <运算符。而是使用WHERE DateTo >= @wkstdate AND DateTo < DATEADD(DAY, 1, @wkenddate)

target

答案 1 :(得分:0)

BETWEEN运算符无法在日期数据上正确处理Times。因此,如果您有两个日期1/1/20002/1/2000,然后要求BETWEEN处理日期时间2/1/2000 14:00,则此日期时间不会介于它们之间。建议从日期时间中删除时间部分,使用CONVERT函数,因为在您的示例中可能是最好的方法。还有其他方法可以剥离时间部分,但CONVERT可能是效率最高的。 (我的例子使用dd/mm/yyyy格式)

我注意到存储过程的效率最低的是使用SELECT * FROM。尝试使用显式字段选择 - 如果您想要更高效的存储过程,请最小化SQL上的负载。

答案 2 :(得分:0)

是的,两者都会给出不同的结果。

  

让我们说wkStDate = 9/1/2015和wkEndDta = 9/30/2015

     

DateTo = 9/1/2015 18:00 HRS(将包括在两个案例中)

     

DateTo = 9/21/2105 18:00 HRS(两种情况都包括在内)

     

DateTo = 9/30/2105 18:00 HRS(将包含在原始查询中但是   在没有转换的第二个查询中排除

换句话说,如果没有转换函数,将从您的查询中排除日期部分与结束日期相同并且时间大于午夜的任何值,即WkEndDate + 00:00:01 To WkEndDate + 23:59:59将被排除在外。所有其他日期将显示相同的结果。

如果您的DateTo是日期时间,并且永远不会有午夜以外的时间,则两个查询都会给出相同的结果。