使用 Snowflake 将时间 PST/PDT 转换为时间戳
Posted
技术标签:
【中文标题】使用 Snowflake 将时间 PST/PDT 转换为时间戳【英文标题】:Convert time PST/PDT to timestamp using Snowflake 【发布时间】:2021-04-22 22:50:29 【问题描述】:背景: 我有下面的数据表,我正在尝试连接 order_date 和 transaction_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 阶段