【问题标题】:Declare date and selected date not match声明日期和所选日期不匹配
【发布时间】: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


【解决方案1】:

根据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)
  • @SalmanA 当我使用 select 语句时它正在工作,但是当我在表中插入该变量时,它插入为 '2019-01-29 11:06:31.097' 因为列的数据类型是日期时间.我必须克服这个问题。
  • @Thebeginner 无法将'.095' 值存储在datetime 列中。您必须按照@Salman 的指示将数据类型转换为datetime2
【解决方案2】:

手册中没有提到的是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 数据类型的表中插入该日期时它正在工作?
  • 您根本无法在datetime 中按原样存储诸如 .001、.002、.995 等值,它们将被舍入(工作 = 舍入然后存储)。
【解决方案3】:

docs中的日期时间:

准确度 - 以 0.000、0.003 或 0.007 秒为增量舍入

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2022-12-01
    • 2018-02-02
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多