我正在创建一个 Snowflake 过程,使最终用户能够创建一个表,其中包含特定间隔的定义时间段内的时间戳列表。
最终用户传递参数:
from_date
:CURRENT_DATE() - 2
to_date
:CURRENT_DATE
diff_factor
:hour
应获得类似于下面的 48 行表
身份证 | ts |
---|---|
1 | 2023 年 12 月 18 日星期一 21:15:46 GMT (等于 CURRENT_DTE() - 2) |
2 | 2023 年 12 月 18 日星期一 22:15:46 GMT |
... | ... |
在下面的代码中,该过程接收两个
DATETIME
参数,如果未提供,则返回到 CURRENT_DATE
。
CREATE OR REPLACE PROCEDURE generate_dates_table(
from_date DATETIME DEFAULT CURRENT_DATE() - 1,
to_date DATETIME DEFAULT CURRENT_DATE,
diff_factor STRING DEFAULT 'hour')
RETURNS TABLE(id INTEGER, ts TIMESTAMP_NTZ)
LANGUAGE SQL
COMMENT = 'Generate nice table with timestamps'
EXECUTE AS CALLER
AS
DECLARE
res RESULTSET
difference INTEGER DEFAULT 1 ;
BEGIN
LET difference := (SELECT(DATEDIFF(:diff_factor, :from_date, :to_date)));
LET res : = (SELECT (SEQ4) AS id,
DATEADD(:diff_factor, SEQ4() , :from_date) AS ts
FROM TABLE(GENERATOR(ROWCOUNT => :difference))));
RETURN TABLE(res);
END
-- Test
CALL generate_dates_table();
SELECT
和 SEQ4
语句difference
应返回稍后可供 GENERATOR
和时间戳计算使用的行数可组合的UDTF:
CREATE OR REPLACE FUNCTION generate_dates_table(
from_date DATETIME DEFAULT CURRENT_DATE() - 1,
to_date DATETIME DEFAULT CURRENT_DATE(),
diff_factor STRING DEFAULT 'hour'
)
RETURNS TABLE(id INTEGER, ts TIMESTAMP_NTZ)
AS
$$
SELECT value::INT, DATEADD('HOUR', value::INT, from_date)
FROM TABLE(FLATTEN(ARRAY_GENERATE_RANGE(0, DATEDIFF('HOUR',from_date,to_date)+1)))
WHERE diff_factor ILIKE 'hour'
UNION ALL
SELECT value::INT, DATEADD('DAY', value::INT, from_date)
FROM TABLE(FLATTEN(ARRAY_GENERATE_RANGE(0, DATEDIFF('DAY',from_date,to_date)+1)))
WHERE diff_factor ILIKE 'day'
-- more dayparts go here
$$
调用示例:
SELECT *
FROM TABLE(generate_dates_table());
SELECT *
FROM TABLE(generate_dates_table(diff_factor=>'DAY'));