1

I have date that I want to increment with 1 millisecond. I am using this sql,

DECLARE @A TABLE
(
    A VARCHAR(2)
)
INSERT INTO @A(A) VALUES ('a1')
INSERT INTO @A(A) VALUES ('b2')
INSERT INTO @A(A) VALUES ('a3')
INSERT INTO @A(A) VALUES ('b4')
INSERT INTO @A(A) VALUES ('a5')
INSERT INTO @A(A) VALUES ('b6')
INSERT INTO @A(A) VALUES ('a7')
INSERT INTO @A(A) VALUES ('b8')

SELECT DATEADD(millisecond, + ROW_NUMBER() OVER (ORDER BY A), '2012-11-22     15:09:24.990'),ROW_NUMBER() OVER (ORDER BY A)
FROM @A

But the result is,

2012-11-22 15:09:24.990 1
2012-11-22 15:09:24.993 2
2012-11-22 15:09:24.993 3
2012-11-22 15:09:24.993 4
2012-11-22 15:09:24.997 5
2012-11-22 15:09:24.997 6
2012-11-22 15:09:24.997 7
2012-11-22 15:09:24.997 8

which is incorrect

4

2 回答 2

4

SQL Server 中的DATETIME数据类型具有 3.33 毫秒的分辨率。

您将永远无法创造15:09:24.991和其他价值 - 您所看到的是预期和记录的行为

如果您需要更高的精度 - 请改用DATETIME2数据类型(它可以处理低至 100ns 的精度)。

DECLARE @StartValue DATETIME2(3) = '20121122 15:09:24.990'

SELECT 
    @StartValue,
    DATEADD(Millisecond, 1, @StartValue),
    DATEADD(Millisecond, 2, @StartValue),
    DATEADD(Millisecond, 3, @StartValue)

生成结果:

2012-11-22 15:09:24.990
2012-11-22 15:09:24.991
2012-11-22 15:09:24.992
2012-11-22 15:09:24.993

如你所愿。

更新:如果您必须坚持DATETIME- 是的,您可以添加 +3 并获得以下结果:

DECLARE @StartValue DATETIME = '20121122 15:09:24.990'

SELECT 
    @StartValue, 
    DATEADD(Millisecond, 3, @StartValue),
    DATEADD(Millisecond, 6, @StartValue),
    DATEADD(Millisecond, 9, @StartValue)

给你:

2012-11-22 15:09:24.990 
2012-11-22 15:09:24.993 
2012-11-22 15:09:24.997 
2012-11-22 15:09:25.000
于 2012-11-22T11:15:48.307 回答
1

您不能以这种方式增加日期的毫秒数。

这取自 msdn:

毫秒的刻度为 3 (.123),微秒的刻度为 6 (.123456),纳秒的刻度为 9 (.123456789)。time、datetime2 和 datetimeoffset 数据类型的最大小数位数为 7 (.1234567)。如果 datepart 是纳秒,则数字必须在日期增加的小数秒之前为 100。1 到 49 之间的数字向下舍入为 0,50 到 99 之间的数字向上舍入为 100。

资源:

MSDN

于 2012-11-22T11:16:12.320 回答