首页 > 解决方案 > 雪花创建日期列表

问题描述

这段代码在 SSMS 中完美运行,但在 Snowflake 中却没有那么多。关于如何修复它的任何建议?

 set (start_date) = ('2017-07-01');
 set (end_date) = ('2022-06-30');

  with get_all_dates as (




      select 
        $start_date as DateValue
        , 1 as level
      union all
      select    
        DATEADD(DAY,1,DateValue)
        , level + 1
      from 
        get_all_dates
      where 
        Datevalue < $end_date
  
  )
  
  select * from get_all_dates;

这会产生以下错误消息:

SQL 编译错误:递归 CTE 'GET_ALL_DATES' 中列 'DATEVALUE' 的锚点和递归项之间的类型不匹配

预期输出:

2017-07-01
2017-07-02
...
2022-06-29
2022-06-30

标签: sqlsnowflake-cloud-data-platform

解决方案


戈登的回答很有用,但要注意—— seq4() 不能保证产生序列号。这意味着您可以获得一系列不同的日期而不是所需的结果。

你可以这样做:

select '2020-01-01'::date+x 
from (
  select row_number() over(order by 0) x 
  from table(generator(rowcount => 1824))
)

较短的版本:

select '2020-01-01'::date + row_number() over(order by 0) x 
from table(generator(rowcount => 1824))

使用任意 start_date 和 end_date:

select -1 + row_number() over(order by 0) i, start_date + i generated_date 
from (select '2020-01-01'::date start_date, '2020-01-15'::date end_date)
join table(generator(rowcount => 10000 )) x
qualify i < 1 + end_date - start_date

在此处输入图像描述


推荐阅读