【问题标题】:Convert epoch to datetime将纪元转换为日期时间
【发布时间】:2018-04-24 15:31:34
【问题描述】:

在一张表上,我有一个 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

【问题讨论】:

  • @DavidG 它们是有效的,由实时系统编写,并在epochconverter.com上进行了高精度检查
  • @DavidG 是的,以微秒为单位,如问题的第一行所述:-)
  • @IrvinDominin 。 . .正如 DavidG 指出的那样,您的值不是有效的 Unix 时间戳。您可以自己在网络上转换它们 epochconverter.com。 “6”的前导数字对于任何正常日期都是高度可疑的。

标签: sql-server tsql datetime epoch


【解决方案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;

您可以使用该功能,但只需将您的 epoch 值相除。由于您对失去保真度感到满意,因此这将完全满足您的需求。例如:

DECLARE @epoch BIGINT = 636453251396217655

SELECT dbo.[fn_EpochToDatetime](@epoch/100000)

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 2012-09-06
    • 2012-11-08
    • 2019-01-15
    • 2016-09-15
    • 2021-12-31
    • 2015-01-23
    • 2019-06-19
    相关资源
    最近更新 更多