1

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

これは正しくありません

4

2 に答える 2

4

DATETIMESQLServerのデータ型の解像度は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 に答える