【问题标题】:SQL Server : DATEADD() not working beyond milliseconds when using a string valueSQL Server:使用字符串值时 DATEADD() 无法工作超过毫秒
【发布时间】:2021-12-16 07:44:09
【问题描述】:

有谁知道为什么会这样:

SELECT DATEADD(HOUR,4,'2021-11-01 05:10:00.0000000')

返回以下错误:

消息 241,第 16 级,状态 1,第 1 行
从字符串转换日期和/或时间时转换失败。

但是当只使用最多 毫秒

SELECT DATEADD(HOUR, 4, '2021-11-01 05:10:00.000')

它工作并返回:

2021-11-01 13:10:00.000

并且当在列包含纳秒的表中使用它时

SELECT DATEADD(HOUR, 4, column-name)

它也有效。

【问题讨论】:

    标签: sql sql-server dateadd


    【解决方案1】:

    因为您提供了一个文字字符串,所以DATEADD 将值转换为其默认数据类型datetimedatetime 精确到 1/300 秒,因此像 2021-11-01 05:10:00.0000000 这样的值太大;它的精度大于 1/300 秒。

    如果您将该值显式转换为最高可达 1/1000000 秒的日期和时间数据类型,它将起作用:

    SELECT DATEADD(HOUR,4,CONVERT(datetime2(7),'2021-11-01 05:10:00.0000000'))
    

    【讨论】:

    • 那么为什么即使它有 纳秒 它也能与表一起使用
    • 因为该列不是varchar,@Shmiel ...它可能是datetime2
    • 感谢您的信息。
    • 对于 erxample,@Shmiel,请注意,在这个小提琴中,错误是通过列 if 复制的,您将日期和时间值存储在 @ 987654329@:db<>fidd;e
    【解决方案2】:

    来自dateadd 文档:

    字符串文字值必须解析为日期时间。

    datetime 类型只能接受毫秒。尝试解析精度超过毫秒的字符串将会失败。

    (请注意,datetime 四舍五入为 0.000、0.003 或 0.007 秒。例如,1 ms 向下舍入为 0。)

    如果您尝试声明 datetime 并将其初始化为具有超过 3 个小数位秒精度的文字字符串,则会发生同样的错误:

    DECLARE @datetime datetime = '12:10:05.0000'
    

    消息 241,第 16 级,状态 1,第 3 行
    从字符串转换日期和/或时间时转换失败。

    您可以添加到datetime2,但您必须先声明datetime2 变量,而不是使用字符串文字:

    declare @date datetime2 = '2021-11-01 05:10:00.0000000'
    SELECT DATEADD(HOUR, 4, @date)
    
    2021-11-01 09:10:00.0000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多