将纪元转换为日期时间

时间:2017-11-11 14:43:53

标签: sql-server tsql datetime epoch

在表格中,我有一个bigint列,用于存储时间戳,精度为微秒级,如下:

636453251396217655
636453251398405201
636453251592389899
636453251668326820

我必须构建一个脚本,如果该日期早于一周,则该行必须移动到另一个表。

我尝试使用以下方式转换为日期:

CREATE FUNCTION [dbo].[UNIXToDateTime] (@timestamp bigint)
        RETURNS datetime
AS
BEGIN
        DECLARE @ret datetime

        SELECT @ret = DATEADD(second, @timestamp, '1970/01/01 00:00:00')

        RETURN @ret
END

并使用如下:

select dbo.UNIXToDateTime(636453251396217655)

但由于bigint我的脚本崩溃,因为:

  

int数据中表达式转换期间的算术溢出错误   型

我可能会失去精确度,重要的是日期部分是sql过滤器的主要部分。

演示:http://sqlfiddle.com/#!6/24f05/1

1 个答案:

答案 0 :(得分:1)

有一个answer here用于转换时代值:

CREATE FUNCTION [dbo].[fn_EpochToDatetime] (@Epoch BIGINT)
RETURNS DATETIME
AS
BEGIN
    DECLARE @Days AS INT, @MilliSeconds AS INT
    SET @Days = @Epoch / (1000*60*60*24)
    SET @MilliSeconds = @Epoch % (1000*60*60*24)

    RETURN (SELECT DATEADD(MILLISECOND, @MilliSeconds, DATEADD(DAY, @Days, '1/1/1970')))
END;

您可以使用该功能,但只需划分您的纪元值。如果您对保真度的损失感到满意,这将完全满足您的需求。例如:

DECLARE @epoch BIGINT = 636453251396217655

SELECT dbo.[fn_EpochToDatetime](@epoch/100000)
相关问题