雪花解释时间戳错误?

Posted

技术标签:

【中文标题】雪花解释时间戳错误?【英文标题】:Snowflake interpreting timestamp wrong? 【发布时间】:2021-06-03 21:06:20 【问题描述】:

我正在通过 Snowflake 将一堆半结构化数据 (JSON) 加载到我的数据库中。条目中的时间戳值是 javascript 时间戳,如下所示: "time": 1621447619899

Snowflake 自动将其转换为如下所示的时间戳变量: 53351-08-15 22:04:10.000.

到目前为止一切顺利。但是,我认为新的时间戳是错误的。实际日期时间应在 2021 年 5 月 19 日 MDT 中午 12 点左右。我读错了吗?它是否取决于我的 Snowflake 实例所在的时区?

【问题讨论】:

如果值 1621447619899 在 JSON 属性中,则 Snowflake 中根本没有该数据的“自动”转换。它将始终将该值视为 JSON 对象,直到您将其转换为其他对象。如果您可以提供将 JSON 属性解析为时间戳值的代码,那将很有帮助。 嘿迈克,请参阅下面我对菲利普的回复。你知道为什么value:time::timestamp 没有正确解析 JSON 吗?我的所有其他值都正确地从该 JSON 中解析出来。 【参考方案1】:

在 SQL 中手动比较以下选项时:

with x as (
    SELECT parse_json('time:1621447619899') as var
    )
SELECT var:time,
       var:time::number,
       var:time::varchar::timestamp,
       1621447619899::timestamp,
       '1621447619899'::timestamp,
       var:time::timestamp
FROM x;

看来您要做的是执行以下操作:

var:time::varchar::timestamp

查看文档,它确实看起来 to_timestamp 正在寻找作为字符串的数字,因此您需要先转换为 varchar,然后再转换为时间戳,否则您将得到您所得到的。

【讨论】:

谢谢,@MattNorton。请务必将解决方案标记为您选择的解决方案并勾选答案。【参考方案2】:

问题说 Snowflake 将其转换为“53351-08-15 22:04:10.000”看起来不错,但对我来说看起来不对。

当我在 Snowflake 中尝试输入数字时,我得到了这个:

select '1621447619899'::timestamp;

-- 2021-05-19T18:06:59.899Z

这更有意义。

您需要提供更多代码或上下文以进行进一步调试 - 但如果您告诉 Snowflake 将该数字转换为时间戳,您将得到正确的时间戳。

在此处查看 Snowflake 使用的规则:

https://docs.snowflake.com/en/sql-reference/functions/to_timestamp.html#usage-notes

【讨论】:

谢谢费利佩!我想我只是说它在格式上看起来是正确的——但值显然是错误的。这是我用来将值转换为时间戳的代码:create or replace table AudienceEntries as select value:time::timestamp as Time from table , lateral flatten (input => v:entries); 我只是尝试将 value:time 导入为字符串和 int,然后将该列转换为时间戳。两个选项都失败,并出现错误“无法将 TIME 列从 VARCHAR(16777216) 类型更改为 TIMESTAMP_NTZ(9)”或“无法将 TIME 列从 NUMBER(38,0) 类型更改为 TIMESTAMP_NTZ(9)” 能否分享一下json对象,让我重现一下?

以上是关于雪花解释时间戳错误?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库时间戳(6)转换为雪花timestamp_ntz时抛出错误

如何获取雪花中表的最后访问时间戳?

将时间戳值插入雪花表

将默认时间戳添加到雪花中的表

在时间戳列中插入 Null 时,雪花复制到失败

将数据从雪花卸载到 s3 时,如何将日期时间戳添加到 zip 文件?