雪花 sql 中的时间戳 VS TIMESTAMP_NTZ

timestamp VS TIMESTAMP_NTZ in snowflake sql

我正在使用 sql 脚本使用 dbt 将 json 解析为雪花 table。

其中一个列包含此日期时间值:'2022-02-09T20:28:59+0000'。

在 Snowflake 中定义 ISO 日期时间数据类型的正确方法是什么?

我在我的 dbt sql 脚本中尝试了 datetimestampTIMESTAMP_NTZ

JSON_DATA:",my_date"::TIMESTAMP_NTZ AS MY_DATE

但很明显,这些不是正确的,因为后来当我用 select * 在雪花中测试它时,我得到了这个错误:

SQL Error [100040] [22007]: Date '2022-02-09T20:28:59+0000' is not recognized

SQL Error [100035] [22007]: Timestamp '2022-02-13T03:32:55+0100' is not recognized

所以我需要知道哪种 Snowflake time/date 数据类型最适合这个

编辑: 这就是我现在正在尝试的。

SELECT 
    JSON_DATA:"date_transmission" AS DATE_TRANSMISSION
  , TO_TIMESTAMP(DATE_TRANSMISSION:text, 'YYYY-MM-DDTHH24:MI:SS.FFTZH:TZM') AS DATE_TRANSMISSION_TS_UTC
    , JSON_DATA:"authorizerClientId"::text AS AUTHORIZER_CLIENT_ID
  , JSON_DATA:"apiPath"::text API_PATH
    , MASTERCLIENT_ID
  , META_FILENAME
  , META_LOAD_TS_UTC
  , META_FILE_TS_UTC
FROM {{ source('INGEST_DATA', 'TABLENAME') }} 

我收到这个错误:

000939 (22023): SQL compilation error: error line 6 at position 4
10:21:46    too many arguments for function [TO_TIMESTAMP(GET(DATE_TRANSMISSION, 'text'), 'YYYY-MM-DDTHH24:MI:SS.FFTZH:TZM')] expected 1, g

但是,如果我注释掉前两行(与 timpstamp 类型相关),其他两行就可以正常工作。用 TO_TIMESTAMP 解析 json 的正确语法是什么?

不是 JSON_DATA:"apiPath"::text API_PATH 在我的雪花 tables 中给出了正确的值。

您应该使用 timestamp(而不是 date,后者不存储时间信息),但您使用的格式可能不会被自动检测到。您可以将输入格式指定为 YYYY-MM-DD"T"HH24:MI:SSTZHTZM,如 here 所示。自动检测的 TZHTZM.

之间有一个 :

做了一些测试,你似乎有 2 个选择。

你可以去掉最后的+0000:left(column_date, len(column_date)-5)

或 try_to_timestamp 格式 try_to_timestamp('2022-02-09T20:28:59+0000','YYYY-MM-DD"T"HH24:MI:SS+TZHTZM')

TZH 和 TZM 是时区偏移小时和分钟

所以这里主要有2点。

  1. 当从 JSON 获取数据以传递给任何需要 ::TEXT 对象的时间戳函数时,但从 JSON 获取的值仍然是::VARIANT 所以他们需要投射。这是你引用错误的原因

    (22023): SQL compilation error: error line 6 at position 4 10:21:46 too many arguments for function [TO_TIMESTAMP(GET(DATE_TRANSMISSION, 'text'), 'YYYY-MM-DDTHH24:MI:SS.FFTZH:TZM')] expected 1, g

    你的SQL也错了,应该是

        TO_TIMESTAMP(DATE_TRANSMISSION::text, 
    
  2. 你如何处理时区 format.As 其他人已经注意到你(就像我在你上一个问题中所做的那样)你想忽略时区值还是阅读它们。我忘记了 TZHTZM 格式。鉴于您有时区数据,您应该使用 TO_TIMESTAMP_TZ`TRY_TO_TIMESTAMP_TZto make sure the time zone data is keep, given you second example shows+0100`

将它们放在一起(假设您不希望额外的 date_transmission 作为数据的变体):

SELECT 
    TO_TIMESTAMP_TZ(JSON_DATA:"date_transmission"::text, 'YYYY-MM-DDTHH24:MI:SS+TZHTZM') AS DATE_TRANSMISSION_TS_UTC
    , JSON_DATA:"authorizerClientId"::text AS AUTHORIZER_CLIENT_ID
    , JSON_DATA:"apiPath"::text AS API_PATH
    , MASTERCLIENT_ID
    , META_FILENAME
    , META_LOAD_TS_UTC
    , META_FILE_TS_UTC
FROM {{ source('INGEST_DATA', 'TABLENAME') }}