具有默认日期时间参数的雪花过程

问题描述 投票:0回答:1

我正在创建一个 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();

错误

  • Snowflake 在尝试编译语句时返回多个错误消息,例如意外的
    SELECT
    SEQ4
    语句

注释

  • 我最感兴趣的是通过 Snowflake 脚本编写和学习:
    • 处理以默认值作为表达式的日期时间参数的适当方法是什么
    • 如何将查询结果存储为变量以便稍后在脚本编写中使用?
      difference
      应返回稍后可供
      GENERATOR
      和时间戳计算使用的行数
    • 关于脚本结构还有其他建议吗
  • 我对生成日期或时间戳列表的非程序解决方案不感兴趣,就像这里提供的漂亮答案
sql stored-procedures timestamp snowflake-cloud-data-platform resultset
1个回答
0
投票

可组合的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'));
© www.soinside.com 2019 - 2024. All rights reserved.