Convert UTC Milliseconds to DATETIME in SQL server

前端 未结 6 1000
没有蜡笔的小新
没有蜡笔的小新 2020-12-02 18:56

I want to convert UTC milliseconds to DateTime in SQL server.

This can easily be done in C# by following code:

DateTime startDate = new DateTime(1970         


        
相关标签:
6条回答
  • 2020-12-02 19:16

    Using SQL Server 2008R2 this produced the required result:

    CAST(SWITCHOFFSET(CAST(dateadd(s, convert(bigint, [t_stamp]) / 1000, convert(datetime, '1-1-1970 00:00:00')) AS DATETIMEOFFSET), DATENAME (TZoffset, SYSDATETIMEOFFSET())) AS DATETIME)
    
    0 讨论(0)
  • 2020-12-02 19:17

    Right now, you can use dateadd with division on minutes and not seconds.

    The code will be like this:

    DATEADD(MILLISECOND, epoch% 60000, DATEADD(MINUTE, epoch/ 60000, '19700101'));

    0 讨论(0)
  • 2020-12-02 19:26

    I had problems with using answers given here (especially that the system was counting ticks form 0001-01-01) - so I did this:

    CONVERT(DATETIME,[Time]/ 10000.0/1000/86400-693595)
    
    --explanation for [Time_in_Ticks]/ 10000.0/1000/86400-693595
    --Time is in "ticks"
    --10000 = number of ticks in Milisecond
    --1000  = number of milisecons in second
    --86400 = number of seconds in a day (24hours*60minutes*60second)
    --693595= number of days between 0001-01-01 and 1900-01-01 (which is base
    --          date when converting from int to datetime)
    
    0 讨论(0)
  • 2020-12-02 19:29

    Below the function that converts milliseconds to datetime

    IF object_id('dbo.toDbTimeMSC', 'FN') IS NOT NULL DROP FUNCTION dbo.toDbTimeMSC
    GO
    CREATE FUNCTION [dbo].[toDbTimeMSC] (@unixTimeMSC BIGINT) RETURNS DATETIME
    BEGIN
        RETURN DATEADD(MILLISECOND, @unixTimeMSC % 1000, DATEADD(SECOND, @unixTimeMSC / 1000, '19700101'))
    END
    GO
    

    -- select dbo.toDbTimeMSC(1348203320000)

    0 讨论(0)
  • 2020-12-02 19:31
    DECLARE @UTC BIGINT
    SET @UTC = 1348203320997 
    
    SELECT DATEADD(MILLISECOND, @UTC % 1000, DATEADD(SECOND, @UTC / 1000, '19700101'))
    
    0 讨论(0)
  • 2020-12-02 19:38

    The DATEADD requires an integer as a second argument. Your number 1348203320000 is very large for integer therefore it produce an error in runtime. Your should use bigint type instead and provide DATEADD with correct int values by splitting your milliseconds to seconds and milliseconds. That is sample you could use.

    DECLARE @total bigint = 1348203320000;
    
    DECLARE @seconds int = @total / 1000
    DECLARE @milliseconds int = @total % 1000;
    
    DECLARE @result datetime = '1970-1-1';
    SET @result = DATEADD(SECOND, @seconds,@result);
    SET @result = DATEADD(MILLISECOND, @milliseconds,@result);
    SELECT @result
    
    0 讨论(0)
提交回复
热议问题