エポックが2038年を超える場合、エポックをDateTime SQL Serverに変換する方法は?
Convert Epoch to DateTime SQL Serverの回答は機能しません。
例:
SELECT DATEADD(ss, 2713795200000 / 1000, '19700101')
2055 年 12 月 30 日木曜日 16:00:00 GMT
エポックが2038年を超える場合、エポックをDateTime SQL Serverに変換する方法は?
Convert Epoch to DateTime SQL Serverの回答は機能しません。
例:
SELECT DATEADD(ss, 2713795200000 / 1000, '19700101')
2055 年 12 月 30 日木曜日 16:00:00 GMT
DATEADD 関数は、日付の増分として INT を想定しています。INT の制限を回避するには、エポックの精度を下げるか、少し複雑なコードを実行してエポックの精度を維持します。
これにより、精度が分に減少します。
SELECT DATEADD(MINUTE,@YourEpoch/60/1000, '1/1/1970')
これはエポックを日とミリ秒に分割し、それらを日時に結合します
CREATE FUNCTION [dbo].[fn_EpochToDatetime] (@Epoch BIGINT)
RETURNS DATETIME
AS
BEGIN
DECLARE @Days AS INT, @MilliSeconds AS INT
SET @Days = @Epoch / (1000*60*60*24)
SET @MilliSeconds = @Epoch % (1000*60*60*24)
RETURN (SELECT DATEADD(MILLISECOND, @MilliSeconds, DATEADD(DAY, @Days, '1/1/1970')))
END;
ただし、2番目のソリューションが期待するほど正確ではない理由はよくわかりません。
上記の応答に基づいて、提供されたソリューションは機能しますが、SQL サーバーの範囲外の日付に変換しようとすることから保護されません。
create function dbo.unixTimestampConversion ( @unixTime bigInt ) は、開始として dateTime2(7) を返します
declare
@output dateTime2(7)
, @days int
, @ms int
, @x int = (1000 * 60 * 60 * 24)
;
set @days = @unixTime / @x
;
set @ms = @unixTime % @x
;
if (@unixTime < 32503593600000 and @unixTime > -2208988800000)
begin
set @output = dateAdd (millisecond, @ms, dateAdd (day, @days, '1/1/1970'))
;
end
;
else if (@unixTime <= -2208988800000)
begin
set @output = '1/1/1900'
;
end
;
else if (@unixTime >= 32503593600000)
begin
set @output = '12/31/2999'
;
end
;
return @output
;
end
;
エポックを日時に変換する関数を作成し、以下のようにクエリで使用します
create FUNCTION [dbo].[from_unixtime] (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN
DECLARE @LocalTimeOffset BIGINT
,@AdjustedLocalDatetime BIGINT;
SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset
RETURN (SELECT DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime)))
END;
次に、クエリでこの関数を使用します