一尘不染

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

sql

当我运行以下命令时:

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,因此在第二天将其舍入,但不会舍入其他任何内容。有什么办法可以防止这种情况?


阅读 232

收藏
2021-03-08

共1个答案

一尘不染

MS SQL使用4个字节存储1900年1月1日之后的日期。4个字节存储午夜之后的时钟滴答。(滴答是3.3毫秒)

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

SQL
Server将时间的第二个整数存储为午夜之后的时钟滴答数。一秒包含300个滴答声,因此滴答声等于3.3毫秒(ms)。您可以通过将datetime值转换为binary(8)值并使用substring函数提取每组4个字节来查看天数和时钟滴答的值。然后,图3中的代码将每组4个字节转换为一个整数。

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

2021-03-08