2016-05-11 2 views
1

У меня есть временные метки, которые находятся в 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 
+0

'1.' преобразовать метку времени в день, разделив его на (24 х 60 х 60 х 1000)' 2.' затем получить баланс во времени и добавить к конвертируемой дате – Squirrel

ответ

4

Я думаю, что вы имеете дело с наносекундной точностью. То, что вы можете получить в родном sql, составляет 100 нс.

declare @ts as bigint = 1462924862735870900 

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

Результатом является 2016-05-11 00: 01: 02,7358709

+0

Я думаю, что вы правы. Я не понимал, что это наносекунда. Все конвертеры, которые я отправил через интернет, только сходили на микросекунду. Спасибо, что указали это и спасибо за ваше решение. Кажется, работает отлично. Еще раз спасибо! – Sequenzia

Смежные вопросы