如何在写入 Snowflake 时使用 Spark/PySpark 将 timestamp_ntz 类型转换为 CST 格式
How to typecast timestamp_ntz to CST format using Spark/PySpark while writing to Snowflake
众所周知,Snowflake 中有 3 个时间戳,
- TIMESTAMP_NTZ
- TIMESTAMP_LTZ
- TIMESTAMP_TZ
因此在将时间戳写入雪花 table 时,默认情况下采用 TIMESTAMP_NTZ。
snowflake 如何在写入 snowflake table 时采用 CST 时区的时间戳?
首先,重要的是要知道您的 account/session:
的默认时区是什么
SHOW PARAMETERS LIKE 'TIMEZONE';
然后将会话的默认设置更改为 CST
ALTER SESSION SET TIMEZONE = 'America/Chicago';
此后 current_timestamp 的任何选择都将在正确的时区提供数据
SELECT CURRENT_TIMESTAMP;
这是一篇很棒的文章,可供参考:
Snowflake timestamp datatype ref
假设您可以控制 table 中的精确列类型,我发现 TIMESTAMP_TZ 是您定义 table 的方式。这是我所做的一切的工作示例:
alter session set timezone = 'America/Los_Angeles';
create or replace table ts_test(rn number, ts timestamp_tz);
insert into ts_test values(1, current_timestamp());
insert into ts_test values(2, '2019-12-10 07:50:00 -06:00');
insert into ts_test values(3, CONVERT_TIMEZONE('America/Chicago', CURRENT_TIMESTAMP()));
select * from ts_test;
如果时间戳是在代码中生成的,那么请确保在插入时包含 UTC 偏移量 (rn 2)。如果您使用的是 LA 的 current_timestamp(),请确保您转换为 CST (rn 3)。
如果正在生成 table 并且您不控制时区默认值,则首先发出此命令:
alter session set timestamp_type_mapping = timestamp_tz;
众所周知,Snowflake 中有 3 个时间戳,
- TIMESTAMP_NTZ
- TIMESTAMP_LTZ
- TIMESTAMP_TZ
因此在将时间戳写入雪花 table 时,默认情况下采用 TIMESTAMP_NTZ。 snowflake 如何在写入 snowflake table 时采用 CST 时区的时间戳?
首先,重要的是要知道您的 account/session:
的默认时区是什么SHOW PARAMETERS LIKE 'TIMEZONE';
然后将会话的默认设置更改为 CST
ALTER SESSION SET TIMEZONE = 'America/Chicago';
此后 current_timestamp 的任何选择都将在正确的时区提供数据
SELECT CURRENT_TIMESTAMP;
这是一篇很棒的文章,可供参考: Snowflake timestamp datatype ref
假设您可以控制 table 中的精确列类型,我发现 TIMESTAMP_TZ 是您定义 table 的方式。这是我所做的一切的工作示例:
alter session set timezone = 'America/Los_Angeles';
create or replace table ts_test(rn number, ts timestamp_tz);
insert into ts_test values(1, current_timestamp());
insert into ts_test values(2, '2019-12-10 07:50:00 -06:00');
insert into ts_test values(3, CONVERT_TIMEZONE('America/Chicago', CURRENT_TIMESTAMP()));
select * from ts_test;
如果时间戳是在代码中生成的,那么请确保在插入时包含 UTC 偏移量 (rn 2)。如果您使用的是 LA 的 current_timestamp(),请确保您转换为 CST (rn 3)。
如果正在生成 table 并且您不控制时区默认值,则首先发出此命令:
alter session set timestamp_type_mapping = timestamp_tz;