如何在 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
我是 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