声明日期和所选日期不匹配

时间:2019-01-30 06:55:26

标签: sql sql-server tsql datetime stored-procedures

我已经声明了一个名为@dt的日期时间变量-

declare @dt Datetime = '2019-01-29 11:06:31.095'

当我选择变量时,它会给出错误的日期

select @dt --it gives '2019-01-29 11:06:31.097'

3 个答案:

答案 0 :(得分:6)

根据manual

  

datetime值四舍五入为.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

答案 1 :(得分:4)

手册中未提及的是DATETIME存储日期的分辨率为秒的1/300 ,即0.0033333333 ...秒的倍数。以下是一些文字和产生的日期时间值:

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),使其在小数点后恰好具有三位数。

答案 2 :(得分:2)

docs中的日期时间:

  

准确性-舍入为.000,.003或.007秒的增量

     

将时间,日期,datetime2和datetimeoffset数据类型用于新   工作。这些类型符合SQL标准。它们更便携。   time,datetime2和datetimeoffset提供更高的秒精度。   datetimeoffset为全局部署提供时区支持   应用程序。