У меня есть временные метки, которые находятся в bigint. Вот один:MSSQL bigint Unix Timestamp to Datetime с миллисекундами
Это до микросекунды точности.
В настоящее время я использую это:
SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01')
Это дает мне даты и времени вплоть до второй, но я хотел бы, чтобы поддерживать, по крайней мере, миллисекунду точности.
Я понимаю, что DATEADD не может обрабатывать bigint, поэтому я усекал bigint и преобразовал его в int. Если я не делаю, что я получаю эту ошибку:
Arithmetic overflow error converting expression to data type int
Я надеюсь, что кто-то может помочь мне понять, лучший способ, чтобы преобразовать это и сохранить по крайней мере, миллисекунду точности.
Любая помощь была бы принята с благодарностью. Благодаря!
---- ОБНОВЛЕНИЕ ------
С помощью @ako, я бросил вместе функцию, которая принимает BigInt метку времени либо в миллисекундах, микросекунд или наносекунд и возвращает datetime2 (7), который 100 nanosecond precision. Возможно, это было более эффективно, но вот функция:
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.' преобразовать метку времени в день, разделив его на (24 х 60 х 60 х 1000)' 2.' затем получить баланс во времени и добавить к конвертируемой дате – Squirrel