雪花 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 脚本中尝试了 date
、timestamp
和 TIMESTAMP_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点。
当从 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,
你如何处理时区 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') }}
我正在使用 sql 脚本使用 dbt 将 json 解析为雪花 table。
其中一个列包含此日期时间值:'2022-02-09T20:28:59+0000'。
在 Snowflake 中定义 ISO 日期时间数据类型的正确方法是什么?
我在我的 dbt sql 脚本中尝试了 date
、timestamp
和 TIMESTAMP_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点。
当从 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,
你如何处理时区 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') }}