【问题标题】:Error Converting Epoch to DateTime in SQL Server when epoch is more than a Trillion seconds当纪元超过万亿秒时,在 SQL Server 中将纪元转换为日期时间时出错
【发布时间】:2013-05-19 15:44:44
【问题描述】:

我尝试了许多已经给出的将 EPOCH 转换为 SQL Server 日期时间的答案。当 EPOCH 达到 10 亿秒时,它们就会起作用。但一旦它越过万亿大关,它就会破产!例如。 -->

1. SELECT dateadd(MCS,1351187877744,'1970-01-01')
2. SELECT dateadd(NS,1351187877744,'1970-01-01')
3. SELECT dateadd(NANOSECOND, 1351187877744, '1970-01-01 00:00:00.0000000')
4. SELECT convert(bigint, datediff(ss, '01-01-1970 00:00:00',1351187877744))

以上所有操作都失败并出现以下溢出错误: “将表达式转换为数据类型 int 时出现算术溢出错误。”

有趣的是,当我在 this site 上输入此日期时,它会返回正确的值。

关于如何以适用于任何数量级(>万亿秒等)的 EPOCH 的方式执行此操作的任何建议

【问题讨论】:

  • Mitch,转换为“GMT:Thu, 2012 年 10 月 25 日 17:57:57 UTC”,这是它应该转换为的正确值。我认为这个问题与精度有关,因为即使十亿秒也足以得到这个日期。

标签: sql-server datetime epoch


【解决方案1】:

试试这个 -

MSDN:

DATEADD: number 参数不能超过 int 的范围。在以下语句中,number 的参数超出 int 的范围 1。返回以下错误消息:“Msg 8115, Level 16, State 2, Line 1. 将表达式转换为数据类型 int 的算术溢出错误。 "

查询:

DECLARE 
      @Date DATETIME = '19700101'
    , @MaxInt INT = 2147483647 
    , @ms BIGINT = 1351187877744

WHILE @ms != 0 BEGIN

    SELECT @Date = DATEADD(ms, CASE WHEN @ms > @MaxInt THEN @MaxInt ELSE @ms END, @Date)
    SELECT @ms = CASE WHEN @ms - @MaxInt < 0 THEN 0 ELSE @ms - @MaxInt END

END

SELECT @Date

输出:

2012-10-25 17:57:57.533

【讨论】:

  • 感谢德瓦特!确实是一个非常优雅的解决方案!
【解决方案2】:

只需创建这个函数

CREATE FUNCTION convertEpoch 
(@epochVal bigint) RETURNS datetime 
AS BEGIN DECLARE @Return datetime
SELECT @return = dateadd(s,@epochVal/1000,'1970-01-01')
RETURN @return END

【讨论】:

    【解决方案3】:

    根据MSDN,语法是:

    DATEADD (datepart , number , date )
    

    在哪里 号码 是可以解析为添加到日期的日期部分的int 的表达式。用户自定义变量有效。

    另外, 对于日期数据类型 smalldatetimedatedatetime,添加日期部分为 microsecondnanosecond不允许

    试试这个:

    DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';
    
    SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)
    

    【讨论】:

    • 问题是当幅度以纳秒为单位时,此语法会失败。如果您看到问题(第 1,2 和 3 点),已经尝试过这种语法。不过感谢您的回复!
    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 2021-05-26
    • 2020-09-14
    • 1970-01-01
    • 2012-09-06
    • 2018-04-24
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多