복붙노트

[SQL] 어떻게 SQL Server의 날짜에 BIGINT (UNIX 타임 스탬프)를 변환 할 수 있습니까?

SQL

어떻게 SQL Server의 날짜에 BIGINT (UNIX 타임 스탬프)를 변환 할 수 있습니까?

어떻게 SQL 서버에서 날짜 시간에 UNIX 타임 스탬프 (BIGINT)를 변환 할 수 있습니까?

해결법

  1. ==============================

    1.시험:

    시험:

    CREATE FUNCTION dbo.fn_ConvertToDateTime (@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;
    GO
    
  2. ==============================

    2.이것은 나를 위해 일한 :

    이것은 나를 위해 일한 :

    Select
        dateadd(S, [unixtime], '1970-01-01')
    From [Table]
    

    경우 하나의 경이로움 왜 1970-01-01,이 에포크 시간이라고합니다.

    다음은 위키 백과에서 인용 한 것입니다 :

  3. ==============================

    3.이처럼

    이처럼

    초 기준일로 유닉스 (시대) 날짜를 추가

    (: 56 : 2010-05-25 07 23.000)를이 지금은 그것을 얻을 것이다

     SELECT dateadd(s,1274756183,'19700101 05:00:00:000')
    

    당신은 반대로 가고 싶다면, 이것 좀 http://wiki.lessthandot.com/index.php/Epoch_Date을

  4. ==============================

    4.사람이 오류가 아래 얻는 경우 :

    사람이 오류가 아래 얻는 경우 :

    유닉스 타임 스탬프로 인해이 BIGINT (대신 INT의), 당신이 사용할 수있는 :

    SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01')
    FROM TABLE
    

    유닉스 타임 스탬프와 실제 열의 하드 코드 된 타임 스탬프를 교체

    출처 : MSSQL 밀리 초 단위로 날짜 시간을 유닉스 타임 스탬프를 BIGINT

  5. ==============================

    5.이 그것을 할 것입니다 :

    이 그것을 할 것입니다 :

    declare @UNIX_TIME int
    select @UNIX_TIME = 1111111111
    -- Using dateadd to add seconds to 1970-01-01
    select [Datetime from UNIX Time] = dateadd(!precision!,@UNIX_TIME,'1970-01-01')
    

    대신! 정밀! 사용 : SS, MS 또는 MCS 타임 스탬프의 정밀도에 따라. BIGINT는 홀드 마이크로 정밀도 할 수 있습니다.

  6. ==============================

    6.이 테스트 :

    이 테스트 :

    는 SQL 서버 :

    SELECT dateadd(S, timestamp, '1970-01-01 00:00:00') 
         FROM 
    your_table
    

    MySQL 서버 :

    SELECT
      from_unixtime(timestamp) 
    FROM 
      your_table
    

    http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php

  7. ==============================

    7.이것은 다니엘 리틀이 질문에 위해 한 일을 구축하지만 (날짜 1902 01-01과 DATEADD 기능에 대한 INT 한계로 인해 더 큰 위해 작품을) 계정 일광 절약 시간을 고려한다 :

    이것은 다니엘 리틀이 질문에 위해 한 일을 구축하지만 (날짜 1902 01-01과 DATEADD 기능에 대한 INT 한계로 인해 더 큰 위해 작품을) 계정 일광 절약 시간을 고려한다 :

    우리 일광 절약 시간의 날짜 범위를 저장하는 테이블을 생성하는 첫번째 필요 (출처 : 역사 미국 시간) :

    CREATE TABLE [dbo].[CFG_DAY_LIGHT_SAVINGS_TIME](
      [BEGIN_DATE] [datetime] NULL,
      [END_DATE] [datetime] NULL,
      [YEAR_DATE] [smallint] NULL
    ) ON [PRIMARY]
    
    GO
    
    INSERT INTO CFG_DAY_LIGHT_SAVINGS_TIME VALUES
    ('2001-04-01 02:00:00.000',   '2001-10-27 01:59:59.997',    2001),
    ('2002-04-07 02:00:00.000',   '2002-10-26 01:59:59.997',    2002),
    ('2003-04-06 02:00:00.000',   '2003-10-25 01:59:59.997',    2003),
    ('2004-04-04 02:00:00.000',   '2004-10-30 01:59:59.997',    2004),
    ('2005-04-03 02:00:00.000',   '2005-10-29 01:59:59.997',    2005),
    ('2006-04-02 02:00:00.000',   '2006-10-28 01:59:59.997',    2006),
    ('2007-03-11 02:00:00.000',   '2007-11-03 01:59:59.997',    2007),
    ('2008-03-09 02:00:00.000',   '2008-11-01 01:59:59.997',    2008),
    ('2009-03-08 02:00:00.000',   '2009-10-31 01:59:59.997',    2009),
    ('2010-03-14 02:00:00.000',   '2010-11-06 01:59:59.997',    2010),
    ('2011-03-13 02:00:00.000',   '2011-11-05 01:59:59.997',    2011),
    ('2012-03-11 02:00:00.000',   '2012-11-03 01:59:59.997',    2012),
    ('2013-03-10 02:00:00.000',   '2013-11-02 01:59:59.997',    2013),
    ('2014-03-09 02:00:00.000',   '2014-11-01 01:59:59.997',    2014),
    ('2015-03-08 02:00:00.000',   '2015-10-31 01:59:59.997',    2015),
    ('2016-03-13 02:00:00.000',   '2016-11-05 01:59:59.997',    2016),
    ('2017-03-12 02:00:00.000',   '2017-11-04 01:59:59.997',    2017),
    ('2018-03-11 02:00:00.000',   '2018-11-03 01:59:59.997',    2018),
    ('2019-03-10 02:00:00.000',   '2019-11-02 01:59:59.997',    2019),
    ('2020-03-08 02:00:00.000',   '2020-10-31 01:59:59.997',    2020),
    ('2021-03-14 02:00:00.000',   '2021-11-06 01:59:59.997',    2021),
    ('2022-03-13 02:00:00.000',   '2022-11-05 01:59:59.997',    2022),
    ('2023-03-12 02:00:00.000',   '2023-11-04 01:59:59.997',    2023),
    ('2024-03-10 02:00:00.000',   '2024-11-02 01:59:59.997',    2024),
    ('2025-03-09 02:00:00.000',   '2025-11-01 01:59:59.997',    2025),
    ('1967-04-30 02:00:00.000',   '1967-10-29 01:59:59.997',    1967),
    ('1968-04-28 02:00:00.000',   '1968-10-27 01:59:59.997',    1968),
    ('1969-04-27 02:00:00.000',   '1969-10-26 01:59:59.997',    1969),
    ('1970-04-26 02:00:00.000',   '1970-10-25 01:59:59.997',    1970),
    ('1971-04-25 02:00:00.000',   '1971-10-31 01:59:59.997',    1971),
    ('1972-04-30 02:00:00.000',   '1972-10-29 01:59:59.997',    1972),
    ('1973-04-29 02:00:00.000',   '1973-10-28 01:59:59.997',    1973),
    ('1974-01-06 02:00:00.000',   '1974-10-27 01:59:59.997',    1974),
    ('1975-02-23 02:00:00.000',   '1975-10-26 01:59:59.997',    1975),
    ('1976-04-25 02:00:00.000',   '1976-10-31 01:59:59.997',    1976),
    ('1977-04-24 02:00:00.000',   '1977-10-31 01:59:59.997',    1977),
    ('1978-04-30 02:00:00.000',   '1978-10-29 01:59:59.997',    1978),
    ('1979-04-29 02:00:00.000',   '1979-10-28 01:59:59.997',    1979),
    ('1980-04-27 02:00:00.000',   '1980-10-26 01:59:59.997',    1980),
    ('1981-04-26 02:00:00.000',   '1981-10-25 01:59:59.997',    1981),
    ('1982-04-25 02:00:00.000',   '1982-10-25 01:59:59.997',    1982),
    ('1983-04-24 02:00:00.000',   '1983-10-30 01:59:59.997',    1983),
    ('1984-04-29 02:00:00.000',   '1984-10-28 01:59:59.997',    1984),
    ('1985-04-28 02:00:00.000',   '1985-10-27 01:59:59.997',    1985),
    ('1986-04-27 02:00:00.000',   '1986-10-26 01:59:59.997',    1986),
    ('1987-04-05 02:00:00.000',   '1987-10-25 01:59:59.997',    1987),
    ('1988-04-03 02:00:00.000',   '1988-10-30 01:59:59.997',    1988),
    ('1989-04-02 02:00:00.000',   '1989-10-29 01:59:59.997',    1989),
    ('1990-04-01 02:00:00.000',   '1990-10-28 01:59:59.997',    1990),
    ('1991-04-07 02:00:00.000',   '1991-10-27 01:59:59.997',    1991),
    ('1992-04-05 02:00:00.000',   '1992-10-25 01:59:59.997',    1992),
    ('1993-04-04 02:00:00.000',   '1993-10-31 01:59:59.997',    1993),
    ('1994-04-03 02:00:00.000',   '1994-10-30 01:59:59.997',    1994),
    ('1995-04-02 02:00:00.000',   '1995-10-29 01:59:59.997',    1995),
    ('1996-04-07 02:00:00.000',   '1996-10-27 01:59:59.997',    1996),
    ('1997-04-06 02:00:00.000',   '1997-10-26 01:59:59.997',    1997),
    ('1998-04-05 02:00:00.000',   '1998-10-25 01:59:59.997',    1998),
    ('1999-04-04 02:00:00.000',   '1999-10-31 01:59:59.997',    1999),
    ('2000-04-02 02:00:00.000',   '2000-10-29 01:59:59.997',    2000)
    GO
    

    이제 우리는 각각 미국의 시간대에 대한 함수를 만듭니다. 이것은 유닉스 시간을 밀리 초 단위로 가정하고있다. 이 초에있는 경우, 코드에서 / 1000을 제거 :

    태평양

    create function [dbo].[UnixTimeToPacific] 
     (@unixtime bigint)
       returns datetime
       as
       begin
         declare @pacificdatetime datetime
         declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
         select  @pacificdatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -7 else -8 end  ,@interimdatetime)
         from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
         if @pacificdatetime is null 
           select @pacificdatetime= dateadd(hour, -7, @interimdatetime)
    return @pacificdatetime    
    end
    

    동양의

    create function [dbo].[UnixTimeToEastern] 
     (@unixtime bigint)
       returns datetime
       as
       begin
         declare @easterndatetime datetime
         declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
         select  @easterndatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -4 else -5 end  ,@interimdatetime)
         from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
         if @easterndatetime is null 
           select @easterndatetime= dateadd(hour, -4, @interimdatetime)
    return @easterndatetime    
    end
    

    본부

    create function [dbo].[UnixTimeToCentral] 
     (@unixtime bigint)
       returns datetime
       as
       begin
         declare @centraldatetime datetime
         declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
         select  @centraldatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -5 else -6 end  ,@interimdatetime)
         from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
         if @centraldatetime is null 
           select @centraldatetime= dateadd(hour, -5, @interimdatetime)
    return @centraldatetime    
    end
    

    create function [dbo].[UnixTimeToMountain] 
     (@unixtime bigint)
       returns datetime
       as
       begin
         declare @mountaindatetime datetime
         declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
         select  @mountaindatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -6 else -7 end  ,@interimdatetime)
         from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
         if @mountaindatetime is null 
           select @mountaindatetime= dateadd(hour, -6, @interimdatetime)
    return @mountaindatetime    
    end
    

    하와이

    create function [dbo].[UnixTimeToHawaii] 
     (@unixtime bigint)
       returns datetime
       as
       begin
         declare @hawaiidatetime datetime
         declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
         select  @hawaiidatetime =  dateadd(hour,-10,@interimdatetime)
         from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
    
    return @hawaiidatetime    
    end
    

    애리조나

    create function [dbo].[UnixTimeToArizona] 
     (@unixtime bigint)
       returns datetime
       as
       begin
         declare @arizonadatetime datetime
         declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
         select  @arizonadatetime =  dateadd(hour,-7,@interimdatetime)
         from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
    
    return @arizonadatetime    
    end
    

    알래스카

    create function [dbo].[UnixTimeToAlaska] 
     (@unixtime bigint)
       returns datetime
       as
       begin
         declare @alaskadatetime datetime
         declare @interimdatetime datetime = dateadd(s, @unixtime/1000, '1970-01-01')
         select  @alaskadatetime =  dateadd(hour,case when @interimdatetime between begin_date and end_date then -8 else -9 end  ,@interimdatetime)
         from cfg_day_light_savings_time  where  year_date = datepart(year,@interimdatetime)
         if @alaskadatetime is null 
           select @alaskadatetime= dateadd(hour, -8, @interimdatetime)
    return @alaskadatetime    
    end
    
  8. ==============================

    8.N, 유닉스 타임 스탬프 00:00:00 협정 세계시 (UTC) 이후 경과 한 시간 (초), 목요일, 1970 년 1 월 1 일이기 때문에 1970-01-01에 n 초를 추가하는 것은 당신에게 UTC 날짜를 줄 것이다.

    N, 유닉스 타임 스탬프 00:00:00 협정 세계시 (UTC) 이후 경과 한 시간 (초), 목요일, 1970 년 1 월 1 일이기 때문에 1970-01-01에 n 초를 추가하는 것은 당신에게 UTC 날짜를 줄 것이다.

    SQL 서버 2016에서는 다른 사용 AT TIME ZONE 한 시간대를 변환 할 수 있습니다. 당신은 윈도우의 표준 형식으로 시간 영역의 이름을 알아야합니다 :

    SELECT *
    FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
    CROSS APPLY (SELECT DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC') AS CA1(UTCDate)
    CROSS APPLY (SELECT UTCDate AT TIME ZONE 'Pacific Standard Time') AS CA2(LocalDate)
    
    | UnixTimestamp | UTCDate                    | LocalDate                  |
    |---------------|----------------------------|----------------------------|
    | 1514808000    | 2018-01-01 12:00:00 +00:00 | 2018-01-01 04:00:00 -08:00 |
    | 1527854400    | 2018-06-01 12:00:00 +00:00 | 2018-06-01 05:00:00 -07:00 |
    

    또는 단순히 :

    SELECT *, DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time'
    FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
    
    | UnixTimestamp | LocalDate                  |
    |---------------|----------------------------|
    | 1514808000    | 2018-01-01 04:00:00 -08:00 |
    | 1527854400    | 2018-06-01 05:00:00 -07:00 |
    

    노트:

  9. ==============================

    9.

    //BIGINT UNIX TIMESTAMP CONVERSION upto Millisecond Accuracy
    CREATE FUNCTION [dbo].[ConvertUnixTimestamp] (@Datetime [BIGINT]) RETURNS DATETIME
    AS
    BEGIN
    
        RETURN DATEADD(MILLISECOND, cast(@Datetime as bigint) % 1000, 
        DATEADD(SECOND, (cast(@Datetime as bigint) / 1000)%60, 
        DATEADD(MINUTE, ((cast(@Datetime as bigint) / 1000)/60)%60, 
        DATEADD(HOUR, ((cast(@Datetime as bigint) / 1000)/60)/60, '19700101'))))
    END
    
  10. ==============================

    10.나도이 문제에 직면해야했다. 난 아직도 2038에 의한 32 비트 정수 캐스트 어딘가에 년 이상 날짜에 도달 할 수없는 불행하게도, 답변 (여기에 다른 페이지 수십에서) 아무도 나에게 만족스러운 없었다.

    나도이 문제에 직면해야했다. 난 아직도 2038에 의한 32 비트 정수 캐스트 어딘가에 년 이상 날짜에 도달 할 수없는 불행하게도, 답변 (여기에 다른 페이지 수십에서) 아무도 나에게 만족스러운 없었다.

    47 : 16.854775849 결국 나를 위해 일했다 해결책은 내가 적어도 2262-04-11T23의 최대 날짜를 가질 수 있도록, 부동 소수점 변수를 사용하는 것이 었습니다. 그럼에도 불구하고,이 전체 날짜 도메인을 포함하지 않지만, 내 요구에 충분와 같은 문제가 발생한 다른 사람을 도움이 될 수 있습니다.

    -- date variables
    declare @ts bigint; -- 64 bit time stamp, 100ns precision
    declare @d datetime2(7) = GETUTCDATE(); -- 'now'
    -- select @d = '2262-04-11T23:47:16.854775849'; -- this would be the max date
    
    -- constants:
    declare @epoch datetime2(7) = cast('1970-01-01T00:00:00' as datetime2(7));
    declare @epochdiff int = 25567; -- = days between 1900-01-01 and 1970-01-01
    declare @ticksofday bigint = 864000000000; -- = (24*60*60*1000*1000*10)
    
    -- helper variables:
    declare @datepart float;
    declare @timepart float;
    declare @restored datetime2(7);
    
    -- algorithm:
    select @ts = DATEDIFF_BIG(NANOSECOND, @epoch, @d) / 100; -- 'now' in ticks according to unix epoch
    select @timepart = (@ts % @ticksofday) / @ticksofday; -- extract time part and scale it to fractional part (i. e. 1 hour is 1/24th of a day)
    select @datepart = (@ts - @timepart) / @ticksofday; -- extract date part and scale it to fractional part
    select @restored = cast(@epochdiff + @datepart + @timepart as datetime); -- rebuild parts to a datetime value
    
    -- query original datetime, intermediate timestamp and restored datetime for comparison
    select
      @d original,
      @ts unix64,
      @restored restored
    ;
    
    -- example result for max date:
    -- +-----------------------------+-------------------+-----------------------------+
    -- | original                    | unix64            | restored                    |
    -- +-----------------------------+-------------------+-----------------------------+
    -- | 2262-04-11 23:47:16.8547758 | 92233720368547758 | 2262-04-11 23:47:16.8533333 |
    -- +-----------------------------+-------------------+-----------------------------+
    

    고려해야 할 몇 가지 포인트가 있습니다 :

  11. ==============================

    11.보다 나은? 이 기능은 날짜에 밀리 초 유닉스 시간을 변환합니다. 그것은 잃어버린 밀리 초,하지만 여전히 필터링에 매우 유용합니다.

    보다 나은? 이 기능은 날짜에 밀리 초 유닉스 시간을 변환합니다. 그것은 잃어버린 밀리 초,하지만 여전히 필터링에 매우 유용합니다.

    CREATE FUNCTION [dbo].[UnixTimestampToGMTDatetime] 
    (@UnixTimestamp bigint)
    RETURNS datetime
    AS
    BEGIN
           DECLARE @GMTDatetime datetime
           select @GMTDatetime = 
           CASE
           WHEN dateadd(ss, @UnixTimestamp/1000, '1970-01-01') 
           BETWEEN 
               Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )) + '-03-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )/4 + 4) % 7)) + ' 01:00:00', 20)
           AND
               Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )) + '-10-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01') )/4 + 1) % 7)) + ' 02:00:00', 20)
           THEN Dateadd(hh, 1, dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))
           ELSE Dateadd(hh, 0, dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))
           END
    RETURN @GMTDatetime    
    END
    
  12. ==============================

    12.해결 방법 다음을 할 수 있습니다 :

    해결 방법 다음을 할 수 있습니다 :

    DECLARE @UnixTimeStamp bigint = 1564646400000 /*2019-08-01 11:00 AM*/
    
    DECLARE @LocalTimeOffset bigint = DATEDIFF(MILLISECOND, GETDATE(), GETUTCDATE());
    DECLARE @AdjustedTimeStamp bigint = @UnixTimeStamp - @LocalTimeOffset;
    SELECT [DateTime] = DATEADD(SECOND, @AdjustedTimeStamp % 1000, DATEADD(SECOND, @AdjustedTimeStamp / 1000, '19700101'));
    
  13. ==============================

    13.시간이 밀리 초를 유지하는 한 필요가있는 경우 :

    시간이 밀리 초를 유지하는 한 필요가있는 경우 :

    DECLARE @value VARCHAR(32) = '1561487667713';
    
    SELECT DATEADD(MILLISECOND, CAST(RIGHT(@value, 3) AS INT) - DATEDIFF(MILLISECOND,GETDATE(),GETUTCDATE()), DATEADD(SECOND, CAST(LEFT(@value, 10) AS INT), '1970-01-01T00:00:00'))
    
  14. from https://stackoverflow.com/questions/2904256/how-can-i-convert-bigint-unix-timestamp-to-datetime-in-sql-server by cc-by-sa and MIT license