【发布时间】:2019-01-30 06:55:26
【问题描述】:
我已经声明了一个名为 @dt 的日期时间变量 -
declare @dt Datetime = '2019-01-29 11:06:31.095'
当我选择变量时它给出了错误的日期
select @dt --it gives '2019-01-29 11:06:31.097'
【问题讨论】:
标签: 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'
【问题讨论】:
标签: sql sql-server tsql datetime stored-procedures
根据manual:
日期时间值以 0.000、0.003 或 0.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
【讨论】:
datetime2(3)
'.095' 值存储在datetime 列中。您必须按照@Salman 的指示将数据类型转换为datetime2。
手册中没有提到的是DATETIME 以 1/300th 秒的分辨率存储日期,即 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),使其在小数点后精确到三位。
【讨论】:
datetime 中按原样存储诸如 .001、.002、.995 等值,它们将被舍入(工作 = 舍入然后存储)。
docs中的日期时间:
准确度 - 以 0.000、0.003 或 0.007 秒为增量舍入
使用 time、date、datetime2 和 datetimeoffset 数据类型来新建 工作。这些类型符合 SQL 标准。它们更便携。 time、datetime2 和 datetimeoffset 提供更高的秒精度。 datetimeoffset 为全局部署提供时区支持 应用程序。
【讨论】: