SQL 服务器:DATEADD() 在使用字符串值时无法超过毫秒

SQL Server : DATEADD() not working beyond milliseconds when using a string value

有谁知道为什么会这样:

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

returns 出现以下错误:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

但是当只使用最多毫秒

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

有效并且returns:

2021-11-01 13:10:00.000

并且在 table 中使用它时,该列包含 纳秒 之类的

SELECT DATEADD(HOUR, 4, column-name)

它也有效。

因为您提供了文字字符串,所以 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'))

来自 dateadd 文档:

A string literal value must resolve to a datetime.

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

(请注意 datetime 四舍五入为 .000、.003 或 .007 秒。例如,1 毫秒向下舍入为 0。)

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

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

Msg 241, Level 16, State 1, Line 3
Conversion failed when converting date and/or time from character string.

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

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

2021-11-01 09:10:00.0000000