[sql] SQL Server에서 bigint (UNIX 타임 스탬프)를 datetime으로 변환하려면 어떻게해야합니까?

SQL Server에서 UNIX 타임 스탬프 (bigint)를 DateTime으로 어떻게 변환 할 수 있습니까?



답변

시험:

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


답변

이것은 나를 위해 일했습니다.

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

왜 1970-01-01인지 궁금한 사람이 있다면 이것은 Epoch time 이라고 합니다 .

아래는 Wikipedia의 인용문입니다.

1970 년 1 월 1 일 목요일 00:00:00 UTC (협정 세계시) 이후 경과 된 초 수입니다. [1] [참고 1] 윤초를 계산하지 않습니다.


답변

누구든지 아래 오류가 발생하는 경우 :

식을 int 데이터 형식으로 변환하는 산술 오버플로 오류

유닉스 타임 스탬프가 int 대신 bigint에 있기 때문에 다음을 사용할 수 있습니다.

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

실제 열의 하드 코딩 된 타임 스탬프를 unix-timestamp로 바꿉니다.

출처 : MSSQL bigint Unix Timestamp to Datetime with milliseconds


답변

이렇게

Unix (epoch) datetime을 기본 날짜에 초 단위로 추가하십시오.

이것은 당분간 얻을 것입니다 (2010-05-25 07 : 56 : 23.000)

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

반대로 가고 싶다면 http://wiki.lessthandot.com/index.php/Epoch_Date를 살펴보십시오 .


답변

이렇게하면됩니다.

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는 마이크로 초 정밀도를 유지할 수 있습니다.


답변

이것을 테스트하십시오 :

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


답변

n 추가 초를1970-01-01 하면 UTC 날짜가 표시됩니다. 왜냐하면 Unix 타임 스탬프 인 n1970 년 1 월 1 일 목요일 00:00:00 UTC (협정 세계시) 이후 경과 한 초 수이기 때문 입니다.

SQL Server 2016에서는 .NET을 사용하여 한 표준 시간대를 다른 표준 시간대로 변환 할 수 있습니다 AT TIME ZONE. Windows 표준 형식의 표준 시간대 이름 만 알고 있으면됩니다.

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 |

노트:

  • 로 캐스팅하여 시간대 정보를 DATETIMEOFFSET자를 수 DATETIME있습니다.
  • 변환에는 일광 절약 시간이 고려됩니다. 태평양 시간은 2018 년 1 월 UTC-08 : 00, 2018 년 6 월 UTC-07 : 00입니다.