選択に基づいて、次のようにx行を返すことができます。
1 2019-07-23 10:14:04.000
1 2019-07-23 10:14:11.000
2 2019-07-23 10:45:32.000
1 2019-07-23 10:45:33.000
ミリ秒はすべて0です。
1 x 1ミリ秒を追加する方法があるので、選択は次のようになります。
1 2019-07-23 10:14:04.001
1 2019-07-23 10:14:11.002
2 2019-07-23 10:45:32.003
1 2019-07-23 10:45:33.004
カーソルを作成しようとしていますが、更新が成功していません。
これは私が望む結果を得るためのクエリです:
select top 10 ModifiedOn
from [SCHEMA].[dbo].[TABLE]
where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'
81kの値があります。フィールドはDATETIME
です。
Datetime
は1ミリ秒のレベルでは正確ではありません。別のデータ型に変更しない限り、求めていることは不可能です(つまり、datetime2
)。
重要な引用:
精度は、.000、.003、または.007秒の増分に丸められます
DateAdd
関数はあなたが探しているものです。
関数の最初のパラメーターとしてmillisecond
を使用して、ミリ秒を追加していることを伝えます。次に、追加するミリ秒数として、2番目のパラメーターとして1
を使用します。
次の例は、現在の時刻を変数に取り込み、それに1ミリ秒を追加して、その結果を2番目の変数として保存し、各変数を出力します。
Declare @RightNow as DateTime2
Declare @RightNowPlusAMillisecond as DateTime2
Select @RightNow = Getdate()
Select @RightNowPlusAMillisecond = DateAdd(millisecond,1,@RightNow)
Print @RightNow
Print @RightNowPlusAMillisecond
結果:
2019-07-23 08:25:38.3500000
2019-07-23 08:25:38.3510000
注意:
Forrestが別の回答で指摘しているように、datetime
データ型はミリ秒の精度を保証していません。 .000、.003、または.007秒の増分に丸められます。ミリ秒の精度が必要な場合は、datetime2
を使用します。
@ Doug-Deden は正しい開始点を持っていますが、質問の元々の意図であると私が考えたものに答えたいだけでした-行あたりのミリ秒を増やして結果セットにそれを適用する方法。
その場合、 ROW_NUMBER および 共通テーブル式 を使用できます(結合などのテーブル構造に合わせて編集します)。
値を表示する場合に選択します。
;WITH CTE AS (
SELECT t.my_id, t.my_date_column, ROW_NUMBER() OVER (ORDER BY my_date_column, my_id DESC) AS R
FROM Table1 t
)
SELECT TOP 1000 *, DATEADD(MILLISECOND, R, CAST(my_date_column AS datetime2)) [new_date]
FROM CTE
ORDER BY my_date_column
結合を更新して元のテーブルに戻す:
;WITH CTE AS (
SELECT t.my_id, t.my_date_column, ROW_NUMBER() OVER (ORDER BY my_date_column, my_id DESC) AS R
FROM Table1 t
)
UPDATE t SET
my_date_column = DATEADD(MILLISECOND, R, CAST(my_date_column AS datetime2))
FROM CTE c
JOIN Table1 t ON c.my_id = t.my_id
私はDATETIME2(3)
を使用してそれを実行しました。
以下のクエリでわかるように、これはeconomic
です。
declare @dt1 datetime2(3)
declare @dt2 datetime2
SELECT @DT1 = SYSDATETIME()
SELECT @DT2= SYSDATETIME()
SELECT [THE LENGTH OF DATETIME2]=DATALENGTH(@DT2)
,[THE LENGTH OF DATETIME2(3)]=DATALENGTH(@DT1)
datetime
とdatetime2
の違いはよく説明されています here 。
この演習では、テスト用の一時テーブルを作成し、random dates
と今日(01-jan-2019
)から999種類の23-july-2019
を入力します
そして順番に、ミリ秒を1から999に設定します
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOEXEC OFF
IF OBJECT_ID ('TEMPDB..#T1') IS NOT NULL
DROP TABLE #T1
CREATE TABLE #t1(the_date DATETIME2(3) NOT NULL PRIMARY KEY CLUSTERED )
GO
-- run this 999 times - hopefully there will be no duplicates
-- SELECT 204*24*60*60 - today is 23-july-2019 - the 203rd day of the year
DECLARE @DT DATETIME2(3)
SELECT @DT = CONVERT(DATETIME2(3),
DATEADD(SECOND, ABS(CHECKSUM(NEWID()) % 17625600),
'2019-01-01'),120)
--SELECT @DT
IF NOT EXISTS( SELECT 1 FROM #T1 WHERE THE_DATE = @DT)
INSERT INTO #T1 VALUES (@DT)
GO 999
--check it out what we have
SELECT * FROM #T1
--get the date and the new date
SELECT
THE_DATE
,THE_NEW_DATE= DATEADD(MILLISECOND, ROW_NUMBER() OVER (ORDER BY THE_DATE), THE_DATE )
FROM #T1
そしてこれは私が得るものです:(部分的なビュー)
他のポスターの1つ は正しいです。 DATETIME
(T-SQLの場合)はミリ秒の精度ではありません(センチ秒の精度です)。
このレベルの精度では、DATETIME2
を使用します。
これは、文字列datetime
をdatetime2
に変換し、1ミリ秒を追加し、最後に文字列に変換する例です。
select convert(
varchar(MAX), --in T-SQL, varchar length is optional
dateadd(
millisecond,
1,
convert(
datetime2,
'2019-07-23 12:01:23.11'
)
)
)