【问题标题】:Error in Timestamp conversion in snowflake雪花中的时间戳转换错误
【发布时间】:2021-08-28 10:57:44
【问题描述】:

我是雪花的新手。我在我的 ETL 过程中使用了一个控制表。我想更新控制表的 watermark_value 字段中的当前时间戳。下面是我的程序代码

CREATE OR REPLACE PROCEDURE test_sp()
  RETURNS string
  LANGUAGE javascript
  EXECUTE AS CALLER
  AS
  $$  
  
    var result = "";  
    snowflake.execute( {sqlText: "BEGIN TRANSACTION;"} );  
    

    try {   
  
        var max_sync_sql_command = `SELECT watermark_value,dateadd(minute, -1, sysdate()) as new_watermark_value  
                                        from APPLICATION_CONTROL 
                                    WHERE TABLE_NAME = 'TEST1'; `
        
        var max_sync_time_result = snowflake.execute ({ sqlText: max_sync_sql_command });
        
        max_sync_time_result.next();            
        var max_sync_time = max_sync_time_result.getColumnValue(1);  
        var new_watermark_value = (max_sync_time_result.getColumnValue(2));  
 
        /*Some ETL Code Here*/ 

        var update_watermark_sql_command = `update APPLICATION_CONTROL  
                                            set watermark_value =  to_varchar(  to_timestamp( '`+new_watermark_value+`', 'DY MON DD HH24:MI:SS TZD YYYY') , 'YYYY-MM-DD HH24:MI:SS')
                                            WHERE TABLE_NAME = 'TEST1'; `

        snowflake.execute ({ sqlText: update_watermark_sql_command });
        
        snowflake.execute( {sqlText: "COMMIT;"} );
        result = "Record updated Successfully"
        }
        catch (err)  
        {
        snowflake.execute( {sqlText: "ROLLBACK;"} );
        result =  "Failed: Code: " + err.code + "\n  State: " + err.state;
        result += "\n  Message: " + err.message;
        result += "\nStack Trace:\n" + err.stackTraceTxt;
        }
  
    return result;    
  
  $$;

在程序执行过程中出现以下错误

Failed: Code: 100183
  State: P0000
  Message: Can't parse 'Fri Jun 11 2021 12:47:38 GMT-0700 (Pacific Daylight Time)' as timestamp with format 'DY MON DD YYYY HH24:MI:SS TZD'
Stack Trace:
At Snowflake.execute, line 25 position 12

application_control 表中 watermark_value 列的数据类型为 TIMESTAMP_NTZ。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    当您从查询中获取结果时,列的顺序错误

    var max_sync_time = max_sync_time_result.getColumnValue(1);  
    var new_watermark_value = (max_sync_time_result.getColumnValue(2)); 
    

    应该是

    var max_sync_time = max_sync_time_result.getColumnValue(2);  
    var new_watermark_value = (max_sync_time_result.getColumnValue(1)); 
    

    更新

    在进行了一些研究后,Snowflake 处理日期/时间的方式,在将值从 SQL 传输到 Javascript 并再次返回时,似乎有点奇怪。提到了 SFDATE 类型,但在我看来,这不是很好的记录。

    无论如何,以下代码结构应该可以工作 - 尽管它为什么工作以及您尝试的内容不是任何人的猜测:

    var update_watermark_sql_command = `update APPLICATION_CONTROL  
                                        set watermark_value =  :1 
                                        WHERE TABLE_NAME = 'TEST1'; `
    
    snowflake.execute ({ sqlText: update_watermark_sql_command, binds: [new_watermark_value.toISOString()] });
    

    【讨论】:

    • 它没有用,我的列顺序是正确的。我只想将 Sat Jun 12 2021 09:35:12 GMT-0700(太平洋夏令时间)转换为时间格式 YYYY-MM-DD HH24:MI:SS
    • 看起来 watermark_value 是一个 varchar?为什么要将时间戳存储在 varchar 中 - 为什么不将其存储在时间戳列中并在查询中以您想要的任何格式显示?
    • 那你为什么要把你写入这个列的值转换成varchar?
    • 之前,我试过没有转换,但得到了上面提到的错误。
    【解决方案2】:

    我在获取值时已将时间戳转换为字符(用于 to_char 函数)并且它起作用了。

    var max_sync_sql_command = `SELECT watermark_value,to_char(dateadd(minute, -1, sysdate())) as new_watermark_value  
                                            from APPLICATION_CONTROL 
                                        WHERE TABLE_NAME = 'TEST1'; `
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      相关资源
      最近更新 更多