RAT_NUMBER与DATEADD不能正常工作?

时间:2012-11-22 11:13:15

标签: 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 ('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

哪个不正确

2 个答案:

答案 0 :(得分:4)

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

永远不会能够创建15:09:24.991和其他值 - 您所期待的内容和documented behavior

如果您需要更高的准确度 - 请使用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

答案 1 :(得分:1)

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

这取自msdn:

  

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

源:

MSDN