我声明了一个名为 @dt 的日期时间变量 -
declare @dt Datetime = '2019-01-29 11:06:31.095'
当我选择变量时,它给出了错误的日期
select @dt --it gives '2019-01-29 11:06:31.097'
根据手册:
日期时间值四舍五入为 .000、.003 或 .007 秒的增量,如下表所示。
提供的链接中的表清楚地说明了您的值从'.095'
转换为'.097'
的原因:
User-specified value System stored value
-----------------------------------------------
01/01/98 23:59:59.999 1998-01-02 00:00:00.000
01/01/98 23:59:59.995
01/01/98 23:59:59.996
01/01/98 23:59:59.997
01/01/98 23:59:59.998 1998-01-01 23:59:59.997
手册中没有提到的是,DATETIME
存储日期的分辨率为 1/300 秒,即 0.00333333333 的倍数...... 第二。下面是一些文本和生成的日期时间值:
literal datetime
2019-01-29 11:06:31.094 2019-01-29 11:06:31.093
2019-01-29 11:06:31.095 2019-01-29 11:06:31.097
2019-01-29 11:06:31.096 2019-01-29 11:06:31.097
2019-01-29 11:06:31.097 2019-01-29 11:06:31.097
2019-01-29 11:06:31.098 2019-01-29 11:06:31.097
2019-01-29 11:06:31.099 2019-01-29 11:06:31.100
您应该开始使用DATETIME2
数据类型,它具有更宽的范围(0001 年到 9999 年)和更高的精度(小数后最多 7 位数字)。您可以将列声明为 DATETIME2(3)
,使其在小数点后正好有三位数字。
文档中的日期时间:
精度 - 四舍五入为 .000、.003 或 .007 秒的增量
将时间、日期、日期时间2 和日期时间偏移量数据类型用于新的 工作。这些类型符合 SQL 标准。它们更便携。 time、datetime2 和 datetimeoffset 提供了更高的秒精度。 日期时间偏移量为全球部署提供时区支持 应用。