[英]Epoch conversion to DateTime in SQL
我提供了一個將歷元轉換為日期時間的SQL函數。
此sql函數不適用於1970年1/3月之前的日期的問題。 是否有人有任何想法使此作品的日期小於1970年。
DECLARE @total bigint
--if greater than 12/31/9999 return null
IF @total > 253402232400000
RETURN NULL
--if less than or equal 1/3/1970 return null
IF @total <= 18000000
RETURN NULL
DECLARE @seconds int = @total / 86400000;
DECLARE @milliseconds int = @total % 86400000;
DECLARE @result datetime = '1970-1-1';
SET @result = DATEADD(DAY, @seconds,@result);
SET @result = DATEADD(MILLISECOND, @milliseconds,@result);
RETURN @result;
嘗試這個。
應該適用於從0001-01-01T00:00:00.000
到9999-12-31T23:59:59.999
所有日期。
-- UnixTimeToDateTime2
--
-- Parameter: 64-bit integer
-- Number of milliseconds
-- since 1970-01-01T00:00:00.000
-- May be negative before 1970
--
-- Returns datetime2
-- Works with all values in
-- range 0001-01-01T00:00:00.000
-- through 9999-12-31T23:59:59.999
-- Returns NULL if parameter is out of range
create function dbo.UnixTimeToDateTime2(@x bigint)
returns datetime2
as
begin
return
case
-- If the parameter is out of range,
-- return NULL
when ( @x < -62135596800000 )
or ( @x > 253402300799999 ) then null
else
-- We would like to add this number of milliseconds
-- directly to 1970-01-01T00:00:00.000, but this
-- can lead to an overflow.
-- Instead we break the addition into a number of days
-- and a number of milliseconds.
-- To get the number of days, we divide by the number
-- of milliseconds in a day. Then add the remainder.
dateadd ( millisecond,
@x % 86400000,
dateadd ( day,
@x / 86400000,
cast( '1970-01-01T00:00:00.000'
as datetime2 )) )
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.