Sql 将日期列与日期时间值进行比较

Sql 将日期列与日期时间值进行比较,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在我们的一个存储过程中发现了以下查询 SELECT *FROM TABLE1 WHERE (CONVERT(DATE,DateTo) BETWEEN @wkstdate AND @wkenddate)) 由于在where子句中使用函数可能会妨碍性能,我将其更改如下: SELECT *FROM TABLE1 WHERE DateTo BETWEEN @wkstdate AND @wkenddate 更改代码后的结果相同。但我不确定这两种方法是否会一直得到相同的结果。上述代码带来不同结果的

我在我们的一个
存储过程中发现了以下查询

SELECT *FROM TABLE1
WHERE (CONVERT(DATE,DateTo) BETWEEN @wkstdate AND @wkenddate))
由于在
where
子句中使用
函数
可能会妨碍性能,我将其更改如下:

 SELECT *FROM TABLE1
 WHERE DateTo BETWEEN @wkstdate AND @wkenddate
更改代码后的结果相同。但我不确定这两种方法是否会一直得到相同的结果。上述代码带来不同结果的任何场景

(注意:@wkstdate和@wkenddate是
DATE
value,而DateTo是
DATETIME
value)


感谢您的建议

介于
之间的
操作员将无法正确处理日期数据上的时间。因此,如果您有两个日期
1/1/2000
2/1/2000
,然后要求
BETWEEN
在类似
2/1/2000 14:00
的日期时间上工作,则此日期时间不在这两个日期时间之间。建议从日期时间中去掉时间部分,使用示例中的
CONVERT
函数可能是最好的方法。还有其他方法可以去除时间部分,但是
转换
可能是最有效的方法。(我的示例使用
dd/mm/yyyy
格式)


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

是,两者都会产生不同的结果

假设wkStDate=2015年9月1日和WKENDTA=2015年9月30日

DateTo=2015年1月9日18:00时(两种情况都包括在内)

DateTo=9/21/2105 18:00(将包括在两种情况下)

DateTo=9/30/2105 18:00(将包含在原始查询中,但 在第二次查询中排除(未转换)

换句话说,任何日期部分与结束日期相同且时间大于午夜的值都将从查询中排除,而不使用转换函数,即WkEndDate+00:00:01到WkEndDate+23:59:59。所有其他日期将显示相同的结果


如果您的DateTo是日期时间,并且不会有午夜以外的时间,那么两个查询将给出相同的结果

这不会产生相同的结果

假设您的
DateTo
是一个
DATETIME
值,它有一个时间组件:

'2015-09-21 01:00:00'
您的
@wkenddate
'2015-09-21'
。由于
'2015-09-21 01:00:00'
@wkstdate和@wkenddate之间的
中的DateTo将无法检索上述行

更多示例:

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
子句中使用函数确实会使您的查询不可搜索,但也有例外。其中之一是

如果您不想将
转换为
日期
,另一种选择是不使用介于之间的运算符。改为使用
>=和=@wkstdate
和DateTo
您应该使用CONVERT(日期,DateTo),因为请确保在CONVERT to DATE之前回答的问题中,请参见:对于日期范围,不要使用BEVER,句号(即无例外)。是的,有人会指出,你可以投到目前为止,它的工作正常,但一般情况下,你需要首先了解。最好的做法是停止在日期范围内使用between。使用>=和<=的组合(如下面Felix Pamittan在答案末尾所示)
WHERE
    DateTo >= @wkstdate 
    AND DateTo < DATEADD(DAY, 1, @wkenddate)