SQL Server 2008 BETWEEN 函数

SQL Server 2008 BETWEEN function

这是我的代码:

DECLARE @d1 DATETIME
DECLARE @d2 DATETIME

SET @d1 = '2015-01-01 00:00:00'
SET @d2 = '2015-12-31 23:59:59.999'

SELECT 
    CASE 
       WHEN ('2016-01-01 00:00:00' BETWEEN @d1 AND @d2) 
          THEN 'is between' 
          ELSE 'not between'
    END  AS BetweenOrNotBetween

我在这里提供的日期比 BETWEEN 函数的范围 1 毫秒, 在我的 SQL 2008 服务器实例,结果是 'is between' 而不是预期的 'not between'...

这是一个错误,还是由于某种我没有看到的原因而在设计中做出的必要妥协?

是的,只要我在 2016 年 1 月 1 日的午夜后增加几分之一秒,我就会得到预期的 'not between' 结果。

查看 datetime type 的文档。在 Rounding of datetime Fractional Second Precision 部分,您会找到对您的问题的解释:

datetime values are rounded to increments of .000, .003, or .007 seconds, as shown in the following table.

这意味着如果你有1毫秒,它实际上四舍五入为0毫秒,所以你的结果是is between。不幸的是,这就是 datetime 数据类型的工作方式,对此您无能为力,除非您可以使用其他数据类型,例如 datetime2.

如果您使用下面的代码,您会发现问题出在日期时间类型上。看看datetime的文档,疑惑就解开了!

DECLARE @d1 datetime2
DECLARE @d2 datetime2

SET @d1 = '2015-01-01 00:00:00.00'
SET @d2 = '2015-12-31 23:59:59.999'

SELECT CASE WHEN ('2016-01-01 00:00:00.00' BETWEEN @d1 AND @d2 ) THEN 'is between' 
       ELSE 'not between'
       END  AS BetweenOrNotBetween