【问题标题】:SQL Server table's Column has date time value but in unrecognizable formatSQL Server 表的列具有日期时间值,但格式无法识别
【发布时间】:2020-04-15 13:12:02
【问题描述】:

我正在使用 SQL Server 2016,并且有一个表,其中一种列数据类型为 BIGINT,但其值为 1586862000000

这不能直接识别为 DateTime 值,因为数据类型也是 BIGINT,但列的名称是 PREV_EXEC_TIME,它暗示值是 DateTime,但有点加密形式加上我的猜测是 15 代表下午 3 点,因为我已在 15:00 执行查询

所以我关心的是如何在我查询 (SELECT) 时将此值转换为标准的 DateTime 格式

是否有像 cast 或 convert 之类的函数来获得预期的输出?

【问题讨论】:

  • 您的第一步需要与使用此字段的其他人交谈,并了解他们如何解释它,存在哪些文档等。15 可能代表下午 3 点(但在哪个时区?),但是数字的其余部分无法识别为时间的任何部分,除了几秒钟。
  • 凡人设计的将日期和时间值存储为整数的方式有很多和扭曲。如果您不知道客户端代码在做什么,请帮自己一个忙,不要猜测,也不要让别人猜测;很容易出错,即使相差一小时也会使您的结果无效。 SELECT DATEADD(second, 1586862000000 / 1000.0, '19700101') 给了我2020-04-14 11:00:00.000,它看起来非常接近有效时间,这几乎可以肯定是以毫秒为单位的时间,可能使用 UNIX 时代,但我不知道它是否真的在UTC 或其他时区。
  • @JeroenMostert 我的错,我忘了提及它的 PST 区,您的查询生成了正确的日期。但时间不正确可能是由于时区。因此,自 PST 以来,我预计时间值为 3,您能否帮助解释为什么将 1586862000000 与 1000.0 分开?
  • 因为DATEADD 不接受不适合INT 的值,所以我将精度降低到秒以使其工作。我怎么知道它以毫秒为单位?只是一个猜测,因为价值看起来太大而不能成为其他任何东西。同样,如果您想帮自己一个忙,您需要实际找出客户端代码存储的内容以及原因。例如,它可能已经对值本身进行了偏移或舍入,了解这一点对于获取正确的本地时间很重要。

标签: sql sql-server


【解决方案1】:

这看起来像一个以毫秒为单位的 Unix 时间戳。如果你满足于二级精度,你可以使用:

select dateadd(second, 1586862000000 / 1000, '1970-01-01')

很遗憾,SQL Server 不支持dateadd_big(),但如果需要,您可以单独添加毫秒:

select dateadd(millisecond, 1586862000000 % 1000, dateadd(second, 1586862000000 / 1000, '1970-01-01'))

【讨论】:

  • 感谢@Gordon,您的查询生成了正确的日期。但时间不正确可能是由于时区。因此,自 PST 以来,我预计时间值为 3,请您帮忙解释为什么将 1586862000000 与 1000.0 分开?
  • 从毫秒转换为秒。结果时间始终为 UTC。如果您想在当地时间进行转换,则需要进行转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2018-06-11
  • 2015-07-31
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多