Snowflake cloud data platform 将json UTC转换为时间戳然后转换为日期时出现意外结果

Snowflake cloud data platform 将json UTC转换为时间戳然后转换为日期时出现意外结果,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我们接收json格式的数据,时间戳以UTC表示。当将json转换为timestamp_tz字段时,它会成功地强制转换(SQL在澳大利亚执行:+11h),但是当相同的结果转换回日期时,它会引用回UTC并返回与timestamp_tz date不匹配的结果。当使用with view并尝试添加where子句xxx::date='yyyy mm dd'时,这就是问题所在 例如: select jj:TransactionDatetime::TIMESTAMP_TZ full_date, j

我们接收json格式的数据,时间戳以UTC表示。当将json转换为timestamp_tz字段时,它会成功地强制转换(SQL在澳大利亚执行:+11h),但是当相同的结果转换回日期时,它会引用回UTC并返回与timestamp_tz date不匹配的结果。当使用with view并尝试添加where子句xxx::date='yyyy mm dd'时,这就是问题所在

例如:

select jj:TransactionDatetime::TIMESTAMP_TZ full_date,
       jj:TransactionDatetime::TIMESTAMP_TZ::date round_date,
       jj:TransactionDatetime::TIMESTAMP_TZ::date = '2020-11-14' is_it_same_date
from 
(
select parse_json('
        {
         
          "TransactionDatetime": "2020-11-13 23:26:31+00"
          
        }'
) jj ) dd  
结果

FULL_DATE,ROUND_DATE,IS_IT_SAME_DATE
"2020-11-14 10:26:31.000","2020-11-13","false"
完整日期为2020年11月14日,时间药水-由原始json UTC时间戳转换而成

ROUND_DATE应该表示从FULL_DATE开始的仅日期部分。它可以做到这一点,但使用UTC表示法,这样可以减少一天的时间

结果是,若我在数据上方有视图,用户开始在“where”子句中使用date,并收到意外的结果

我预计这一轮的日期应该是“2020-11-14”

我认为这是一种意想不到的行为,需要在snowflake上进行修复。当然有解决办法,但应该在本地进行

谢谢

这里:

alter session set timezone = 'Australia/Sydney';
select CURRENT_TIMESTAMP(); -- returns 2020-11-24 23:44:24.013 +1100 as of now
select '2020-11-13 23:26:31+00'::TIMESTAMP_TZ as full_date; -- returns 2020-11-13 23:26:31.000 +0000
select '2020-11-13 23:26:31+00'::TIMESTAMP_TZ::date as date_only; -- return 2020-11-13
select '2020-11-13 23:26:31+00'::TIMESTAMP_LTZ as full_date; -- returns 2020-11-14 10:26:31.000 +1100 
select '2020-11-13 23:26:31+00'::TIMESTAMP_LTZ::date as date_only; --returns 2020-11-14

谢谢Sergiu,使用TIMESTAMP_LTZ::date时效果很好。会议已经是“澳大利亚/悉尼”;TIMESTAMP_TZ根据UTC格式显示Au时区,但对该值的任何操作都使用原始值。因此,如果源数据采用UTC格式,则最好使用LTZ。