MSSQL bigint Unix时间戳到日期时间,以毫秒为单位

Seq*_*zia 3 t-sql sql-server unix-timestamp

我有一些bigint的时间戳.这是一个:

1462924862735870900

这低至微秒精度.

我目前正在使用这个:

SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01')
Run Code Online (Sandbox Code Playgroud)

这给了我日期时间到第二个,但我想保持至少毫秒的精度.

我意识到DATEADD无法处理bigint,这就是我截断bigint并将其转换为int的原因.如果我不这样做,我会收到此错误:

Arithmetic overflow error converting expression to data type int
Run Code Online (Sandbox Code Playgroud)

我希望有人能帮助我找到一种更好的方法来转换它并保持至少毫秒的精度.

任何帮助将不胜感激.谢谢!

----更新------

在@ako的帮助下,我将一个以毫秒,微秒或纳秒为单位的bigint时间戳的函数组合在一起,并返回100纳秒精度的 DATETIME2(7).它可能更有效但这里的功能是:

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
Run Code Online (Sandbox Code Playgroud)

Ako*_*Ako 5

我认为你正在处理纳秒精度.你可以在本机sql中获得的是100ns精度.

declare @ts as bigint = 1462924862735870900

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

结果是2016-05-11 00:01:02.7358709