将日期转换为雪花的sfdate

5jvtdoz2  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(385)

我在使用snowflake的javascript处理snowflake中的日期时遇到问题。
一个选择查询并获取日期。它在源表中声明为日期。我希望能够在此日期上添加1天,然后将其插入另一个表的日期字段中。但是,我得到了一个绑定错误。在另一个stackoverflow的帮助下,我得到了返回的类型,发现它是一个字符串,而不是sfdate。
如何将select返回的字符串转换为可以处理的日期?一个额外的问题是我怎样才能增加一天的价值?
还尝试使用try\u to\u 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

在这两种情况下

huus2vyu

huus2vyu1#

默认javascript Date.toString() 表示法将日期转换为非标准格式的字符串。另外,使用 Date 确保您通过 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只识别标准格式的字符串,并拒绝表单的js日期字符串 Sun Jul 29 2018 00:00:00 GMT-0700 (PDT) . 使用 Date.toISOString() 而是生成一个可用于snowflake sql类型的可用表示。
此外,在 snowflake.createStatement(…) 必须始终是元素数组,即使您计划只向其传递单个元素。也就是说,供应 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() 方法,而不是按原样传递它(默认值 toString() 生成不兼容的格式)。
注意:在可能的情况下,尝试通过sql操作它,只提取结果,这样就不必使用两个不同的日期/时间类型系统。
进一步阅读:
mozilla的javascript内置参考
snowflake的存储过程类型和API参考
在snowflake的存储过程中处理sql和javascript之间的类型转换
支持的自动字符串到日期/时间/时间戳输入格式的雪花列表

相关问题