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
'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