使用错误处理将整数转换为雪花中的日期

Posted

技术标签:

【中文标题】使用错误处理将整数转换为雪花中的日期【英文标题】:Convert Integer to Date in Snowflake using Error Handling 【发布时间】:2020-07-30 15:17:16 【问题描述】:

我有一个要求,将整数值转换为 Snowflake 中的日期类型。最初我使用以下查询来获得所需的结果:

选择 TO_DATE(TO_varchar(19000000+1200034),'YYYYMMDD') 2019-07-09

现在,当我对输入使用相同的查询 - “20200034”时,我收到以下错误:

选择 TO_DATE(TO_varchar(19000000+1200034),'YYYYMMDD')

无法将“20200034”解析为格式为“YYYYMMDD”的日期

“20200034”实际上来自雪花表中的一列。为了解决这个问题,我尝试使用“TRY_TO_DATE”函数,但“TRY_TO_DATE”函数的输出结果不正确。请在下面找到详细信息:

选择 TRY_TO_DATE(TO_varchar(19000000+1200034))

1970-08-22

根据 Snowflake 文档,错误处理函数不支持 TO_DATE 、 DATE 支持的可选格式参数。 https://docs.snowflake.com/en/sql-reference/functions/try_to_date.html

【问题讨论】:

TRY_TO_DATE with pattern? - 现在支持TRY_TO_DATE(...., <pattern>) 【参考方案1】:

您可以在调用 TRY_TO_DATE 函数之前为会话设置 DATE_INPUT_FORMAT。

【讨论】:

我的主要目标是在无法解析输入值时返回默认日期值。我正在尝试使用合并函数解决此问题。例如 COALESCE(TO_DATE(TO_VARCHAR(19000000 + ),'YYYYMMDD'),'2019-01-30') 。这种情况可以通过设置 DATE_INPUT_FORMAT 来处理吗? 更改会话集 DATE_INPUT_FORMAT ='YYYYMMDD';选择 TRY_TO_DATE(TO_varchar(19000000+1200034) );选择 TRY_TO_DATE(TO_varchar(19000000+1201029) );【参考方案2】:

我建议您联系 Snowflake 支持并要求他们使用格式字符串启用 try_to_date - 它可用但需要手动启用。

但是您必须注意,“20200034”上的 TRY_TO_DATE 将被解析为 NULL。

【讨论】:

我想使用合并操作来处理这种情况,因为这个函数需要应用于雪花表的列值。例如 COALESCE(TRY_TO_DATE(TO_VARCHAR(19000000 + ),'YYYYMMDD'),'2019-01-30') 这完全可以工作——我仍然会说联系支持人员或按照 Mike 告诉你的那样在会话中设置 DATE_INPUT_FORMAT——这将改变预期的输入格式,并且 TRY_TO_DATE 将根据所需的格式进行解析(但是,这也会搞砸所有“默认”格式化日期)

以上是关于使用错误处理将整数转换为雪花中的日期的主要内容,如果未能解决你的问题,请参考以下文章

将 Avro 中存储为整数(自 1970 年 1 月 1 日以来的天数)的“日期”转换为雪花“日期”类型

在雪花中使用 try_cast 处理非常长的数字

处理 Swift 2.0 中的转换错误

默认日期雪花:无效标识符“日期”

如何将长口头日期时间转换为雪花中的时间戳(YYYY-MM-DD HH:MM:SS)?

如何告诉 lapply 忽略错误并处理列表中的下一件事?