MSSQL bigint Unix 时间戳到以毫秒为单位的日期时间
MSSQL bigint Unix Timestamp to Datetime with milliseconds
我有一些 bigint 格式的时间戳。这是一个:
1462924862735870900
精确到微秒级。
我目前正在使用这个:
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 时间戳和 returns 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
我认为您正在处理纳秒精度。在原生 sql 中可以获得的是 100ns 精度。
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
我有一些 bigint 格式的时间戳。这是一个:
1462924862735870900
精确到微秒级。
我目前正在使用这个:
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 时间戳和 returns 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
我认为您正在处理纳秒精度。在原生 sql 中可以获得的是 100ns 精度。
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