【问题标题】:Convert bigint epoch in SQL Server在 SQL Server 中转换 bigint 纪元
【发布时间】:2019-06-21 07:56:24
【问题描述】:

在 Azure 数据仓库中将 unix 纪元时间戳转换为正常日期时间时遇到问题:

select 
    dateadd(s, convert(bigint, 2551564800), convert(datetime, '1-1-1970 00:00:00')) as bigint

错误:

将表达式转换为数据类型 int 时出现算术溢出错误。

值 2551564800 等于 2050 年 9 月 11 日。

任何帮助将不胜感激

【问题讨论】:

  • @Larnu,问题与处理 DATEADD 函数中大于 max int 值的值有关。您指出使用 DATEADD 函数的问题。这是一个差异问题。
  • 感谢您的建议,但我在 Azure Sql 数据仓库上运行此代码,并且不支持 dataadd_big。还有其他选择吗?
  • “我在 Azure Sql 数据仓库上运行这段代码” 然后标记它;因为这决定了这是否是重复的。
  • 谢谢,刚刚也编辑了我的帖子。
  • 不幸的是,T-SQL 现在有一个DATEDIFF_BIG,但还没有一个DATEADD_BIG(或接受BIGINT 作为参数的选项。您需要使用select DATEADD(SECOND, 2551564800 % 3600, DATEADD(HOUR, 2551564800 / 3600, '19700101')) 的两步方法。 (20 亿小时约为 34 万年,因此对于任何可表示的值,这不会溢出。)

标签: sql-server epoch bigint azure-sqldw


【解决方案1】:

如果您没有大于 5103129600 的纪元值(这将允许您的日期不超过 2106-02-07T06:28:13),这将起作用:

SELECT DATEADD(SECOND,2551564800 % 2147483647, DATEADD(SECOND,2147483647 * (V.Epoch / 2147483647),'19700101'))
FROM (VALUES(CONVERT(bigint,2551564800))) V(Epoch)

【讨论】:

  • 我明白你为什么在代码中使用了 2147483647,它是 int 数据类型的最大值。尽管它有 2106 年的限制,但对我来说它是有效的。我会接受它作为解决方案。非常感谢,也感谢所有的贡献者。
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多