雪花中的时间戳转换错误

时间:2021-06-11 13:36:27

标签: snowflake-cloud-data-platform

我是雪花的新手。我在 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。

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

2 个答案:

答案 0 :(得分:0)

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

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)); 

更新

在做了一些研究之后,当将值从 SQL 传输到 Javascript 并再次传输回来时,Snowflake 处理日期/时间的方式似乎有点奇怪。提到了 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()] });

答案 1 :(得分:0)

我在获取值时已将时间戳转换为字符(使用 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'; `