Sql 带DATEADD的行号运行不正常?

Sql 带DATEADD的行号运行不正常?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个日期,我想增加1毫秒。我正在使用这个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 (

我有一个日期,我想增加1毫秒。我正在使用这个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
但结果是,

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
这是不正确的

SQL Server中的日期时间数据类型的分辨率为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
SQL Server中的DATETIME数据类型的分辨率为3.33ms

您将永远无法创建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

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

这来自msdn:

毫秒的刻度为3.123,微秒的刻度为6 .123456,纳秒的刻度为9.123456789。当时,, datetime2和datetimeoffset数据类型的最大刻度为7 .1234567. 如果datepart为纳秒,则数字必须在 日期增加的分数秒。介于1和49之间的数字是 向下舍入为0,从50到99的数字向上舍入为100

资料来源:


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

这来自msdn:

毫秒的刻度为3.123,微秒的刻度为6 .123456,纳秒的刻度为9.123456789。当时,, datetime2和datetimeoffset数据类型的最大刻度为7 .1234567. 如果datepart为纳秒,则数字必须在 日期增加的分数秒。介于1和49之间的数字是 向下舍入为0,从50到99的数字向上舍入为100

资料来源:


我现在无法更改数据库。任何其他解决方案。我可以加上12或3,等等。您只能执行建议的操作,或者可能添加另一列并使用此列添加更多值。请使用乘法*3更新您的答案。这是我的工作。像SELECT DATEADDMILLISCED,+3*行数比订单多出一个。。。。。。这将对其他人有帮助。我现在无法更改我的数据库。任何其他解决方案。我可以加上12或3,等等。您只能执行建议的操作,或者可能添加另一列并使用此列添加更多值。请使用乘法*3更新您的答案。这是我的工作。像SELECT DATEADDMILLISCED,+3*行数比订单多出一个。。。。。。这将对其他人有所帮助