为什么DATEDIFF在第二天将23:59.59.999视为?

时间:2017-12-06 20:56:08

标签: sql sql-server

当我运行以下内容时:

DECLARE @date1 datetime = '2017-12-01 23:59:59.998'
DECLARE @date2 datetime = '2017-12-11 00:00:00.000'
SELECT DATEDIFF(day, @date1, @date2)

我得到了预期的10,因为它只比较了日期部分

但是,如果我加一毫秒:

DECLARE @date1 datetime = '2017-12-01 23:59:59.999'
DECLARE @date2 datetime = '2017-12-11 00:00:00.000'
SELECT DATEDIFF(day, @date1, @date2)

我得到9.似乎SQL Server在23:59.59.999到24:00.00.000之间进行了四舍五入,因此第二天却没有完成任何其他事情。有什么方法可以阻止这种情况吗?

1 个答案:

答案 0 :(得分:1)

MS SQL使用 4个字节来存储1900年1月1日以后的日子。 4个字节用于存储午夜过后的时钟。 (一个刻度是3.3毫秒)

你看到的是溢出。由于该数字不能用4个字节表示,因此它将使用第5个字节,从而将日期增加1。

  

SQL Server将该时间的第二个整数存储为   时钟午夜过后。第二个包含300个刻度,所以勾选   等于3.3毫秒(ms)。你可以看到天和的值   时钟通过将日期时间值转换为二进制(8)值来进行滴答   使用substring函数提取每组4个字节。代码   然后在图3中将每组4个字节转换为整数。

来源:http://www.itprotoday.com/microsoft-sql-server/solving-datetime-mystery