如何将我所知道的 UTC TIMESTAMP_NTZ 转换为 Snowflake SQL 中的 TIMESTAMP_TZ?

ece*_*ulm 7 sql snowflake-cloud-data-platform

我有一个 type 列TIMESTAMP_NTZ,它包含我知道在 UTC 时区的时间戳。主要是我想转换为,TIMESTAMP_TZ因为我还有其他列,TIMESTAMP_TZ并且我希望能够执行涉及两者的操作。

我尝试TIMESTAMP_TZ通过以下方式生成:

SELECT 
   '2019-10-24 12:07:24.000'::timestamp_ntz as orig -- a literal timestamp_ntz 
   ,convert_timezone('UTC', 'UTC', orig) -- the 3-args version of convert_timezone will always return a TIMESTAMP_NTZ
   ,convert_timezone('UTC', orig) -- the 2-args assumes that orig timezones is session's current timezone 
;
Run Code Online (Sandbox Code Playgroud)

只是为了明确我想转换2019-10-24 12:07:24.0002019-10-24 12:07:24.000 +0000

Snowflake 中是否有任何函数或运算符允许我将其视为TIMESTAMP_NTZX TIMESTAMP_TZ时区?

ece*_*ulm 5

您可以使用两个丑陋的技巧

  • TIMESTAMP_TZ_FROM_PARTSTIMESTAMP_TZ :使用源中的所有组件构造一个新组件TIMESTAMP_NTZ,并提供时区作为最后一个参数。这是非常冗长的。请参阅下面的示例。
  • TO_TIMESTAMP_TZCONCAT:将 序列化为TIMESTAMP_NTZ字符串/VARCHAR在其末尾添加时区字符串并将整个内容重新解析为TIMESTAMP_TZ.
select 
       '2019-10-24 12:07:24.567'::timestamp_ntz as orig
       ,TIMESTAMP_TZ_FROM_PARTS( year(orig), month(orig),day(orig), hour(orig), minute(orig), second(orig) , date_part(nanosecond, orig), 'UTC' ) 
       ,TO_TIMESTAMP_TZ(orig::varchar || ' +0000')
;

--
2019-10-24 12:07:24.567        -- TIMESTAMP_NTZ (UTC)
2019-10-24 12:07:24.567 +0000  -- TIMESTAMP_TZ  (UTC)
2019-10-24 12:07:24.567 +0000  -- TIMESTAMP_TZ  (UTC)
Run Code Online (Sandbox Code Playgroud)


Sim*_*onD 3

您应该能够在原始 TIMESTAMP_NTZ 的末尾添加“Z”后缀,然后将其转换为 TIMESTAMP_TZ,如下所示:

-- Set timezone to something which isn't UTC 
alter session set TIMEZONE = 'America/Los_Angeles';
-- Make sure the timestamp TZ output format is as you'd expect
alter session set TIMESTAMP_TZ_OUTPUT_FORMAT = "YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM";

select 
       '2019-10-24 12:07:24.567'::timestamp_ntz as orig, -- Outputs "2019-10-24 12:07:24.567000000"
       (orig::varchar||'Z')::timestamp_tz timestamp_with_tz --Outputs "2019-10-24 12:07:24.567 +0000"
;
Run Code Online (Sandbox Code Playgroud)