4

エポックが2038年を超える場合、エポックをDateTime SQL Serverに変換する方法は?

Convert Epoch to DateTime SQL Serverの回答は機能しません。

例:

SELECT DATEADD(ss, 2713795200000 / 1000, '19700101')

2055 年 12 月 30 日木曜日 16:00:00 GMT

4

4 に答える 4

1

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番目のソリューションが期待するほど正確ではない理由はよくわかりません。

于 2016-05-20T04:40:36.567 に答える
0

上記の応答に基づいて、提供されたソリューションは機能しますが、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

;

于 2021-03-18T19:36:48.337 に答える
-2

エポックを日時に変換する関数を作成し、以下のようにクエリで使用します

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;

次に、クエリでこの関数を使用します

于 2016-05-18T13:14:37.940 に答える