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
这是我的代码:
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