2012-09-21 10 views
17

Chcę przekonwertować UTC milisekund na DateTime w serwerze SQL.Konwertuj UTC Milisekund na DATETIME w serwerze SQL

Można to łatwo zrobić w C# przez następujący kod:

DateTime startDate = new DateTime(1970, 1, 1).AddMilliseconds(1348203320000); 

muszę zrobić to na serwerze SQL. Znalazłem skrypt here, ale to było podejmowanie początkowych tyknięć od 1900-01-01.

Użyłem funkcji DATEADD jak poniżej, ale to był dając przepełnienie wyjątku supping milisekund jako różnica:

SELECT DATEADD(MILLISECOND,1348203320000,'1970-1-1') 

jaki sposób można zrobić konwersję prawidłowo?

Odpowiedz

33
DECLARE @UTC BIGINT 
SET @UTC = 1348203320997 

SELECT DATEADD(MILLISECOND, @UTC % 1000, DATEADD(SECOND, @UTC/1000, '19700101')) 
3

Numer DATEADD wymaga liczby całkowitej jako drugiego argumentu. Twój numer 1348203320000 jest bardzo duży dla liczby całkowitej, dlatego powoduje błąd w czasie wykonywania. Zamiast tego należy użyć typu: bigint i podać DATEADD z poprawnymi wartościami int, dzieląc milisekundy na sekundy i milisekundy. To jest próbka, której możesz użyć.

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 
1

miałem problemy z użyciem odpowiedzi udzielone tutaj (zwłaszcza, że ​​system został licząc formularz ticks 0001-01-01) - tak zrobiłem to:

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) 
2

Poniżej funkcji, konwertuje milisekund 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 

- wybierz dbo.toDbTimeMSC (1348203320000)

-1

Używając SQL Server 2008R2, uzyskano wymagany wynik:

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)