如何在 javascript 存储过程雪花中循环日期字符串参数

how to loop through date string parameter in javascript stored procedure snowflake

我是 javascript 的新手,snowflake 在存储过程中使用类似 js 的语法。

我正在尝试创建动态 SQL 以便它在 start_date 到 end_date 之间循环以根据日期从不同的 s3 文件夹复制到

CREATE PROCEDURE load_dynamic_s3path_to_table(begin_date strings, end_date strings)
AS
$$

    
    var stmt = snowflake.createStatement(
        {sqlText: "copy into table from s3://test/2020-01-01/"}
        );
    var rs = stmt.execute();

$$;

根据存储过程中的日期参数,例如begin_date2020-01-01,end_date2020-01-03。

我想执行 copy into 命令 3 次;

copy into table from s3://test/2020-01-01/
copy into table from s3://test/2020-01-02/
copy into table from s3://test/2020-01-03/

我想象伪代码是这样的:

CREATE PROCEDURE load_dynamic_s3path_to_table(begin_date strings, end_date strings)
AS
$$
    var dates = begin_date
    while date(dates)>=date(begin_date) and date(dates)<date(end_date)
        var stmt = snowflake.createStatement(
            {sqlText: "copy into table from s3://test/" + dates}
            );
        var rs = stmt.execute();
        dates+=1

$$;

谁能帮忙把伪代码转换成正确的 js 语法并在 snowflake 中执行?

谢谢!

在 JavaScript 中管理日期并非易事,但此存储过程可以满足您的要求:

CREATE OR REPLACE PROCEDURE dates("begin_date" string, "end_date" string)
RETURNS string
LANGUAGE javascript
AS
$$
    function printed_date(d) {
        return d.toISOString().split("T")[0]
    }

    function execute_query(d) {
        var stmt = snowflake.createStatement({
            sqlText: "select '" + d + "' x"
            // "copy into table from s3://test/" + d
        });
        var rs = stmt.execute();
        rs.next();
        return rs.getColumnValue(1);
    }

    var running_date = new Date(begin_date)
    var last_day = new Date(end_date)
    var total_days = (last_day - running_date) / (1000 * 60 * 60 * 24);
    cs = []
    for(var iter=0; iter<=total_days; iter++ ) {
        cs.push(execute_query(printed_date(running_date)));
        running_date.setDate(running_date.getDate() + 1)
   }
   return cs
$$;

call dates('2020-10-01', '2020-10-04');
-- 2020-10-01,2020-10-02,2020-10-03,2020-10-04