【问题标题】: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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多