SQLサーバーでUTCミリ秒をDateTimeに変換したい。
これは、次のコードによってC#で簡単に実行できます。
DateTime startDate = new DateTime(1970, 1, 1).AddMilliseconds(1348203320000);
SQLサーバーでこれを行う必要があります。いくつかのスクリプトを見つけました こちら ですが、これは1900-01-01から最初のティックを取得していました。
私は以下のようにDATEADD
関数を使用しましたが、これはミリ秒を差として供給することにより算術オーバーフロー例外を与えていました:
SELECT DATEADD(MILLISECOND,1348203320000,'1970-1-1')
どうすれば変換を適切に行うことができますか?
DECLARE @UTC BIGINT
SET @UTC = 1348203320997
SELECT DATEADD(MILLISECOND, @UTC % 1000, DATEADD(SECOND, @UTC / 1000, '19700101'))
ミリ秒を日時に変換する関数の下
IF object_id('dbo.toDbTimeMSC', 'FN') IS NOT NULL DROP FUNCTION dbo.toDbTimeMSC
GO
CREATE FUNCTION [dbo].[toDbTimeMSC] (@unixTimeMSC BIGINT) RETURNS DATETIME
BEGIN
RETURN DATEADD(MILLISECOND, @unixTimeMSC % 1000, DATEADD(SECOND, @unixTimeMSC / 1000, '19700101'))
END
GO
-dbo.toDbTimeMSC(1348203320000)を選択します
DATEADD
には、2番目の引数として整数が必要です。あなたの番号 1348203320000
は整数に対して非常に大きいため、実行時にエラーが発生します。代わりにbigint
タイプを使用し、ミリ秒を秒とミリ秒に分割して、DATEADDに正しいint値を指定する必要があります。それはあなたが使用できるサンプルです。
DECLARE @total bigint = 1348203320000;
DECLARE @seconds int = @total / 1000
DECLARE @milliseconds int = @total % 1000;
DECLARE @result datetime = '1970-1-1';
SET @result = DATEADD(SECOND, @seconds,@result);
SET @result = DATEADD(MILLISECOND, @milliseconds,@result);
SELECT @result
SQL Server 2008R2を使用すると、これにより必要な結果が得られました。
CAST(SWITCHOFFSET(CAST(dateadd(s, convert(bigint, [t_stamp]) / 1000, convert(datetime, '1-1-1970 00:00:00')) AS DATETIMEOFFSET), DATENAME (TZoffset, SYSDATETIMEOFFSET())) AS DATETIME)
ここで与えられた回答の使用に問題がありました(特にシステムが0001-01-01からティックをカウントしていたため)-だから私はこれをしました:
CONVERT(DATETIME,[Time]/ 10000.0/1000/86400-693595)
--explanation for [Time_in_Ticks]/ 10000.0/1000/86400-693595
--Time is in "ticks"
--10000 = number of ticks in Milisecond
--1000 = number of milisecons in second
--86400 = number of seconds in a day (24hours*60minutes*60second)
--693595= number of days between 0001-01-01 and 1900-01-01 (which is base
-- date when converting from int to datetime)
現在、dateaddは、秒ではなく分で除算して使用できます。
コードは次のようになります。
DATEADD(MILLISECOND, Epoch% 60000, DATEADD(MINUTE, Epoch/ 60000, '19700101'));