使用 Snowflake 将时间 PST/PDT 转换为时间戳

Posted

技术标签:

【中文标题】使用 Snowflake 将时间 PST/PDT 转换为时间戳【英文标题】:Convert time PST/PDT to timestamp using Snowflake 【发布时间】: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

请帮忙??谢谢!!

【问题讨论】:

【参考方案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 版本会更好地扩展。

以上是关于使用 Snowflake 将时间 PST/PDT 转换为时间戳的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 将 csv 文件加载到 SnowFlake 表中

无法将数据从 Snowflake 复制到 Azure Blob

如何将 Azure MLStudio 与 Snowflake 连接

使用 Airflow PUT 命令将 S3 文件移动到 Snowflake 阶段

将数据从 Pandas 存储到 Snowflake 的最佳方式

如何使用 Python 将 blob 数据移动到 Snowflake