简体   繁体   English

在SQL中将纪元转换为DateTime

[英]Epoch conversion to DateTime in SQL

I have a SQL function that was provided which convert epoch to a date time. 我提供了一个将历元转换为日期时间的SQL函数。

The issues that this sql function does not work for dates before 1/3/1970. 此sql函数不适用于1970年1/3月之前的日期的问题。 Does anyone have any ideas to make this work for dates less than 1970. 是否有人有任何想法使此作品的日期小于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;

Try this. 尝试这个。
Should work for all dates from 0001-01-01T00:00:00.000 through 9999-12-31T23:59:59.999 . 应该适用于从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