当我运行以下内容时:
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之间进行了四舍五入,因此第二天却没有完成任何其他事情。有什么方法可以阻止这种情况吗?
答案 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