Epoch conversion to DateTime in SQL

前端 未结 1 1811
攒了一身酷
攒了一身酷 2021-01-28 10:10

I have a SQL function that was provided which convert epoch to a date time.

The issues that this sql function does not work for dates before 1/3/1970. D

相关标签:
1条回答
  • 2021-01-28 10:54

    Try this.
    Should work for all dates from 0001-01-01T00:00:00.000 through 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
    
    0 讨论(0)
提交回复
热议问题