Snowflake cloud data platform 使用雪花将时间PST/PDT转换为时间戳

Snowflake cloud data platform 使用雪花将时间PST/PDT转换为时间戳,snowflake-cloud-data-platform,dbt,Snowflake Cloud Data Platform,Dbt,背景: 我有下面的数据表,其中我正试图将订单日期和交易时间列合并,以创建最终的时间戳列 问题: 事务时间列中有一个PST/PDT字符串。我正在尝试将最后的时间戳列(VARCHAR)转换为UTC时间戳 我尝试的解决方案无效: select transaction_date , to_date(transaction_date, 'mon dd, yyyy') as order_date , transaction_time , concat(transaction_date,

背景: 我有下面的数据表,其中我正试图将订单日期交易时间列合并,以创建最终的时间戳

问题: 事务时间列中有一个PST/PDT字符串。我正在尝试将最后的时间戳列(VARCHAR)转换为UTC时间戳

我尝试的解决方案无效:

select
  transaction_date
  , to_date(transaction_date, 'mon dd, yyyy')    as order_date
  , transaction_time
  , concat(transaction_date, ' ', transaction_time)   as timestamp
--  , to_timestamp_tz(concat(transaction_date, ' ', transaction_time), 'mon dd, yyyy hh:mm:ss am pdt')   as final_timestamp
from raw_db.schema_name.table_name
请帮忙??谢谢


因此PST和PDT不是有效的iana时区,这是预期的,因此您不能使用内置函数来处理该问题,但可以解决它

SELECT time
    ,try_to_timestamp(time, 'YYYY-MM-DD HH12:MI:SS AM PDT') as pdt_time
    ,try_to_timestamp(time, 'YYYY-MM-DD HH12:MI:SS AM PST') as pst_time
    ,dateadd('hour',7, pdt_time) as pdt_as_utc_time
    ,dateadd('hour',8, pst_time) as pst_as_utc_time
    ,coalesce(pdt_as_utc_time, pst_as_utc_time) as utc_time1
    ,iff(substr(time, -3) = 'PDT', pdt_as_utc_time, pst_as_utc_time ) as utc_time2
FROM VALUES
    ('2020-10-28 7:25:44 AM PDT'),
-- insert more rows here...
    ('2020-11-06 6:35:18 PM PST') 
    v(time);
显示了从这两种方法获取统一UTC时间的两种方法

可缩短为:

SELECT time
    ,coalesce(dateadd('hour',7, try_to_timestamp(time, 'YYYY-MM-DD HH12:MI:SS AM PDT')), dateadd('hour',8, try_to_timestamp(time, 'YYYY-MM-DD HH12:MI:SS AM PST'))) as utc_time1
    ,iff(substr(time, -3) = 'PDT',dateadd('hour',7, try_to_timestamp(time, 'YYYY-MM-DD HH12:MI:SS AM PDT')), dateadd('hour',8, try_to_timestamp(time, 'YYYY-MM-DD HH12:MI:SS AM PST')) ) as utc_time2
FROM VALUES
    ('2020-10-28 7:25:44 AM PDT'),
    ('2020-11-06 6:35:18 PM PST') 
    v(time);   
其中:

TIME                        UTC_TIME1             UTC_TIME2
2020-10-28 7:25:44 AM PDT   2020-10-28 14:25:44   2020-10-28 14:25:44
2020-11-06 6:35:18 PM PST   2020-11-07 02:35:18   2020-11-07 02:35:18
根据我的评论,如果您需要支持更多时区,让我们假设新西兰的两个时区;-)那么一个案例就更合适了

SELECT time
    ,substr(time, -4) as tz_str -- longer and NZxT is longer
    ,CASE
       WHEN tz_str = ' PDT' THEN dateadd('hour',7, try_to_timestamp_ntz(time, 'YYYY-MM-DD HH12:MI:SS AM PDT'))
       WHEN tz_str = ' PST' THEN dateadd('hour',8, try_to_timestamp_ntz(time, 'YYYY-MM-DD HH12:MI:SS AM PST'))
       WHEN tz_str = 'NZDT' THEN dateadd('hour',-13, try_to_timestamp_ntz(time, 'YYYY-MM-DD HH12:MI:SS AM NZDT'))
       WHEN tz_str = 'NZST' THEN dateadd('hour',-12, try_to_timestamp_ntz(time, 'YYYY-MM-DD HH12:MI:SS AM NZST'))
   END as utc_time
FROM VALUES
    ('2020-10-28 7:25:44 AM PDT'),
    ('2020-11-06 6:35:18 PM PST'),
    ('2021-04-23 2:45:44 PM NZST'),
    ('2021-01-23 2:45:44 PM NZDT')
    v(time);

或者你可以使用正则表达式来匹配像这样的日期时间的
AM/PM
部分,只需使用一个try\u\u timestamp\u ntz,然后根据后缀大小写进行更正。

Wow这是一个上帝级的解决方案。需要花时间来理解这一切是如何运作的。谢谢你的帮助!!我明白。。哇,太棒了。干杯如果您需要支持4-5个时区,然后使用
CASE
语句,则
IFF
版本会更好地扩展。