使用Cast As Date与DateTime作为Between

时间:2018-03-15 17:26:14

标签: sql sql-server

这是:

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结果,我应该总是包含一个带有我日期的时间组件。

3 个答案:

答案 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'