【问题标题】:Error handling function TRY_TO_TIMESTAMP not working as expected错误处理函数 TRY_TO_TIMESTAMP 未按预期工作
【发布时间】:2023-01-11 19:23:26
【问题描述】:
我有一个列(对于前 Col1),它包含字符串值 'Jan 14 2019 5:30PM' 并且想在 Snowflake 的目标表中将其转换为 timestamp_ntz(6) 格式。
像这样使用逻辑
INSERT INTO <target_table>
SELECT try_to_timestamp(<Col1>,'MON DD YYYY HH12:MI PM')
FROM <source_table>
这是抛出错误:
TRY_CAST 不能与 TIMESTAMP_NTZ(9) 和 TIMESTAMP_NTZ(9) 类型的参数一起使用。
【问题讨论】:
标签:
snowflake-cloud-data-platform
【解决方案1】:
SELECT try_to_timestamp(column1,'MON DD YYYY HH12:MI PM')
FROM VALUES
('Jan 14 2019 5:30PM');
作品:
| TRY_TO_TIMESTAMP(COLUMN1,'MON DD YYYY HH12:MI PM') |
| 2019-01-14 17:30:00.000 |
但是将字符串预解析为实际时间戳,然后尝试解析失败
SELECT try_to_timestamp(column1,'MON DD YYYY HH12:MI PM')
FROM VALUES
(to_timestamp('Jan 14 2019 5:30PM','MON DD YYYY HH12:MI PM'));
给出错误:
函数 TRY_CAST 不能与 TIMESTAMP_NTZ(9) 和 TIMESTAMP_NTZ(9) 类型的参数一起使用
原来这种类型的问题如果你传递一个 BOOLEAN 给 TRY_TO_BOOLEAN 也会发生。
如果您不知道“您输入的所有内容是时间戳还是文本(比如它是否来自可能发生自动魔术转换的 VARIANT 数据。
我会说
您可以强制转换为 ::TEXT,然后再次解析。
但这也有错误。
is_timestamp_ntz(b)
如果传递非变体数据则失败。所以这没有帮助。
一个非常讨厌的解决方法:
设置:
create temp table data(json variant);
insert into data select parse_json(column1) as json
FROM VALUES
('{"date":"Jan 14 2019 5:30PM"}'),
('{"date":"2021-01-24 12:34:56"}');
数据库:
SELECT
is_timestamp_ntz(json:date) as a
,try_to_timestamp_ntz(json:date::text,'MON DD YYYY HH12:MI PM') as b
,try_to_timestamp_ntz(json:date::text) as c
,try_to_timestamp_ntz(nvl(b,c)::text) as d
,nvl(try_to_timestamp_ntz(json:date::text,'MON DD YYYY HH12:MI PM'),try_to_timestamp_ntz(json:date::text)) as sigh
FROM data;
因此我建议打开一个支持票,因为它是 JSON 数据的自动分类,然后分解解析代码,同时这里是解决方法,将其转换为文本,并解析您期望的格式,然后让系统默认捕获时间戳所在的内容,将其转换为文本,然后再返回。
nvl(try_to_timestamp_ntz(json:date::text,'MON DD YYYY HH12:MI PM'),try_to_timestamp_ntz(json:date::text)) as sigh
【解决方案2】:
尝试这个:
select try_cast(to_varchar(column1) as timestamp) from table;