【问题标题】:Convert date into sfdate for snowflake将日期转换为雪花的 sfdate
【发布时间】:2020-10-19 05:37:28
【问题描述】:

我在使用 Snowflake 的 Javascript 处理 Snowflake 中的日期时遇到问题。

一个选择查询并获得一个日期。它在源表中声明为日期。 我希望能够将 1 天添加到该日期,然后将其插入另一个表的 DATE 字段中。但是,我收到了一个绑定错误。在另一个stackoverflow的帮助下,我得到了返回 输入并发现它是一个字符串,而不是 sfDate。

如何将选择的返回字符串转换为我可以使用的日期?一个额外的问题是我怎样才能在这个值上增加一天?

还尝试使用 try_to_date 将其转换为日期,如下所示:

                    var convertedRunningDate = Date("Sun Jul 29 2018 00:00:00 GMT-0700 (PDT)");
                    statement = snowflake.createStatement(
                        {
                            sqlText: " insert into mytable(date_stamp)  values(try_to_date(?)) "
                            ,binds: convertedRunningDate 
                        }
                    );

没有它:

                    var convertedRunningDate = Date("Sun Jul 29 2018 00:00:00 GMT-0700 (PDT)");
                    statement = snowflake.createStatement(
                        {
                            sqlText: " insert into mytable(date_stamp)  values(?) "
                            ,binds: convertedRunningDate 
                        }
                    );


我明白了

Invalid binds argumentSun Jul 29 2018 00:00:00 GMT-0700 (PDT). Error: Unsupported type for binding argument 2undefined

在这两种情况下

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    默认的 JavaScript Date.toString() 表示将日期转换为字符串 in a format that is non-standard。此外,要使用Date constructor,请确保传递new 关键字,否则Date 用作拒绝无效输入并静默返回当前日期的函数。

    > console.log(Date("Sun Jul 29 2018 00:00:00 GMT-0700 (PDT)"))
    "Mon Jun 29 2020 01:16:31 GMT-0700 (PDT)"
    
    > console.log(new Date("Sun Jul 29 2018 00:00:00 GMT-0700 (PDT)"))
    "Sun Jul 29 2018 00:00:00 GMT-0700 (PDT)"
    

    当在 SQL 中使用来自 JavaScript 的默认日期字符串格式以转换为日期或时间戳类型时,Snowflake 仅识别标准格式的字符串,并将拒绝 Sun Jul 29 2018 00:00:00 GMT-0700 (PDT) 形式的 JS 日期字符串。请改用Date.toISOString() 来生成适用于 Snowflake SQL 类型的可用表示。

    此外,snowflake.createStatement(…) 中的 binds 参数必须始终是一个元素数组,即使您计划只向它传递一个元素。也就是说,提供binds: [convertedRunningDate] 而不是binds: convertedRunningDate

    结合以上两点,这里有一个示例,展示了如何在 JavaScript 中将日期从一个表操作到另一个表。

    create or replace table source_table(datecol date) as select current_date;
    
    create or replace table dest_table (datecol date);
    
    CREATE OR REPLACE PROCEDURE insert_date_plus_one() 
    RETURNS boolean 
    LANGUAGE JAVASCRIPT 
    AS 
    $$ 
        // Grab a datecol from a select query
        var source_date_stmt = snowflake.createStatement(
          {
            sqlText: "select datecol from source_table"
          }
        );
        var source_resultset = source_date_stmt.execute();
        source_resultset.next();
        
        // This is of type SfDate because it came from a query ResultSet,
        // so we can apply standard JS Date functions over it
        var source_date = source_resultset.getColumnValue(1);
        
        // Function to increment a Date object by one standard day
        // Sourced from https://stackoverflow.com/questions/563406/add-days-to-javascript-date
        function addDaysInJs(date, days) {
          var result = new Date(date);
          result.setDate(result.getDate() + days);
          return result;
        }
        
        var dest_date = addDaysInJs(source_date, 1);
        
        // Insert the incremented date using its ISO representation string
        // which will allow Snowflake to grok it properly
        var dest_date_stmt = snowflake.createStatement(
          {
            sqlText: "insert into dest_table values (?)"
            ,binds: [dest_date.toISOString()]
          }
        );
        var dest_resultset = dest_date_stmt.execute();
        var did_insert_run = dest_resultset.next();
        
        return did_insert_run;
    $$ ;
    
    call insert_date_plus_one();
    

    这会产生结果:

    > select * from source_table;
    +------------+
    | DATECOL    |
    |------------|
    | 2020-06-29 |
    +------------+
    > select * from dest_table;
    +------------+
    | DATECOL    |
    |------------|
    +------------+
    
    > call insert_date_plus_one();
    +----------------------+
    | INSERT_DATE_PLUS_ONE |
    |----------------------|
    | TRUE                 |
    +----------------------+
    
    > select * from dest_table;
    +------------+
    | DATECOL    |
    |------------|
    | 2020-06-30 |
    +------------+
    

    如果您需要任意使用Date 对象而不是从表格行中获取它,只需确保正确构造它们(使用new),并且在绑定时使用其Date.toISOString() 方法而不是将其传递为-is(默认toString() 产生不兼容的格式)。

    注意:如果可能,请尝试通过 SQL 对其进行操作并仅提取结果,这样您就不必使用两种不同的日期/时间类型系统。

    进一步阅读

    【讨论】:

    • 我将您的回复标记为我的回复,因为它有效。我尝试在 Google 上搜索 Snowflake 和 sfDate,或者 Snowflake 和 Javascript,但无法获得 API。雪花至少说它需要一个 sfDate,但他们没有说你上面所说的关于 ISO 日期的内容。我现在所做的大部分工作都是用 Javascript 编写的,但这并没有得到很好的记录。你能给我指出这些东西的Javadoc之类的东西吗?是的,我知道如果我以正确的方式谷歌搜索它,我会得到我想要的。如果我只知道。提前致谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多