我有一个日期,我希望以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
哪个不正确
答案 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。
源: