【问题标题】:Convert time PST/PDT to timestamp using Snowflake使用 Snowflake 将时间 PST/PDT 转换为时间戳
【发布时间】:2021-04-22 22:50:29
【问题描述】:

背景: 我有下面的数据表,我正在尝试连接 order_datetransaction_time 列以创建最终的 timestamp

问题: transaction_time 列中有一个 PST/PDT 字符串。我正在尝试将我的最终 timestamp 列(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

请帮忙??谢谢!!

【问题讨论】:

    标签: snowflake-cloud-data-platform dbt


    【解决方案1】:

    所以 PST 和 PDT 不是 Timestamp Formats 所期望的有效 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
    

    根据我的评论,如果您需要支持更多 TIMEZONE,比如说新西兰的两个时区 ;-) 那么 CASE 会更合适

    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 部分,就像在这个SO Question/Answer 中一样,并且只有一个 try_to_timestamp_ntz 并且只需使用 CASE 根据后缀进行更正。

    【讨论】:

    • 哇,这是神级解决方案。需要时间来了解这一切是如何运作的。谢谢你的帮助!!
    • 我明白了.. 哇,太棒了。干杯!
    • 如果您需要支持 4-5 个时区,然后使用 CASE 语句,IFF 版本会更好地扩展。
    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 2015-09-08
    • 2016-11-21
    • 2016-01-13
    • 1970-01-01
    • 2021-05-28
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多