簡體   English   中英

在SQL中將紀元轉換為DateTime

[英]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.0009999-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM