【发布时间】: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