2016-05-11 9 views
1

Ich habe einige Zeitstempel, die in bigint sind. Hier ist eine:MSSQL bigint Unix Zeitstempel zu Datetime mit Millisekunden

Dies ist auf mikrosekundengenau.

ich zur Zeit das bin mit:

SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01') 

Das ist mir Datetime auf die Sekunde ist zu geben, aber ich möchte zumindest millisekundengenau halten.

Ich weiß, dass DATEADD nicht mit Bigint umgehen kann, deshalb habe ich die Bigint abgeschnitten und in int konvertiert. Wenn ich das nicht tun, dass ich diesen Fehler:

Arithmetic overflow error converting expression to data type int 

Ich hoffe, jemand kann mir helfen, einen besseren Weg finden, um diese zu konvertieren und mindestens millisekundengenau zu halten.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

---- ------ UPDATE

Mit Hilfe @ako warf ich zusammen eine Funktion, die einen Zeitstempel Bigint entweder in Millisekunden, Mikrosekunden oder Nanosekunden und gibt DATETIME2 (7) erfolgt, die ist 100 nanosecond precision. Es könnte wahrscheinlich effizienter sein, aber hier ist die Funktion:

CREATE FUNCTION [dbo].[fn_tsConvert] (@ts bigint) 
RETURNS DATETIME2(7) 
AS BEGIN 
    DECLARE @ts2 DATETIME2(7) 

    -- MILLISECOND 
    IF(LEN(@ts) = 13) 
     SET @ts2 = DATEADD(HH,-4,DATEADD(MILLISECOND, @ts % 1000, DATEADD(SECOND, @ts/1000, CAST('1970-01-01' as datetime2(7))))) 

    -- MICROSECOND 
    IF(LEN(@ts) = 16) 
     SET @ts2 = DATEADD(HH,-4,DATEADD(MICROSECOND, @ts % 1000000, DATEADD(SECOND, @ts/1000000, CAST('1970-01-01' as datetime2(7))))) 

    -- NANOSECOND 
    IF(LEN(@ts) = 19) 
     SET @ts2 = DATEADD(HH,-4,DATEADD(NANOSECOND, @ts % 1000000000, DATEADD(SECOND, @ts/1000000000, CAST('1970-01-01' as datetime2(7))))) 

    RETURN @ts2 

END 
+0

'1.' den Zeitstempel zu Tag konvertieren, indem es durch (24 x 60 x 60 x 1000)' 2.' dann Dividieren Zeit in Balance bringen und zum konvertierten Datum hinzufügen – Squirrel

Antwort

4

Ich denke, dass Sie mit Nanosekunde Präzision handeln. Was Sie in native sql erhalten können, ist 100ns Präzision.

declare @ts as bigint = 1462924862735870900 

select dateadd(NANOSECOND, @ts % 1000000000, dateadd(SECOND, @ts/1000000000, cast('1970-01-01' as datetime2(7)))) 

Das Ergebnis ist 2016.05.11 00: 01: 02,7358709

+0

Ich denke, du hast Recht. Ich wusste nicht, dass das eine Nanosekunde war. Alle Konverter, die ich online durchführte, gingen nur auf Mikrosekunden. Danke, dass Sie darauf hingewiesen haben und danke für Ihre Lösung. Scheint perfekt zu funktionieren. Danke noch einmal! – Sequenzia

Verwandte Themen