这是:
between cast(date as date) and cast(date1 as date)
与:
相同between '01/01/01 00:00:00' and '01/01/01 11:59:59'
我被告知在比较SQL Server中的日期时间值时,如果我想返回PROPER结果,我应该总是包含一个带有我日期的时间组件。
答案 0 :(得分:5)
请勿使用between
日期。这只是冒险。通常,使用正确的语法是:
where dtcol >= @date1 and
dtcol < dateadd(day, 1, @date2)
注意不平等的方向。这适用于日期和日期/时间的列。所以,它只是有效。
Aaron Bertrand有一篇很好的博文,What do BETWEEN and the devil have in common?。
答案 1 :(得分:2)
戈登是个好消息。我可以用你自己的话证明原因。你写道:
between '01/01/01 00:00:00' and '01/01/01 11:59:59'
对于不经常使用24小时的人来说,这很容易看起来是正确的逻辑。不幸的是它有两个问题。首先,没有“AM / PM”指定,默认解释是中午。这是一个容易犯的错误,在测试过程中可能找不到(开发人员很懒 - 相信)。
其次,您具体说明日期时间。该数据类型的最大可能时间组件是多少?这不是你提供的;而它是23:59:59.997。如果有人将数据类型更改为更精确的datetime2会发生什么?
您可能很容易将此问题视为不太可能 - 事实确实如此。但是这种边缘情况最终会出现的习惯 - 通常是出现问题的情况。最好编写对正在使用的数据类型正确的代码,而不依赖于假设和运气。
我将提供Tibor's日期时间指南的链接 - 其网站还包含许多其他值得阅读的优秀内容。
答案 2 :(得分:1)
不,
between cast(date as date) and cast(date1 as date)
与:
相同between '20180310 00:00:00' and '20180315 00:00:00'
介于值之间,它相当于:
@Dt >= '20180310 00:00:00'
and @Dt <= '20180315 00:00:00'