web-dev-qa-db-ja.com

SQLサーバーでUTCミリ秒をDATETIMEに変換する

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')

どうすれば変換を適切に行うことができますか?

24
Mohan
DECLARE @UTC BIGINT
SET @UTC = 1348203320997 

SELECT DATEADD(MILLISECOND, @UTC % 1000, DATEADD(SECOND, @UTC / 1000, '19700101'))
45
Mikael Eriksson

ミリ秒を日時に変換する関数の下

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)を選択します

4
GLeb

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
3
tsionyx

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)
2
stinkyjak

ここで与えられた回答の使用に問題がありました(特にシステムが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)
2
Tariq2k

現在、dateaddは、秒ではなく分で除算して使用できます。

コードは次のようになります。

DATEADD(MILLISECOND, Epoch% 60000, DATEADD(MINUTE, Epoch/ 60000, '19700101'));

0
Ygalbel