日期 Netezza 的递归 CTE SQL

Recursive CTE of Dates Netezza SQL

我在 SQL 服务器上 运行 有以下代码 - 它 returns 每个月最后一天的 table 个季度日期,从用户定义的第一次约会。我需要在 Netezza SQL:

中实现代码
                DECLARE @YEAR INT= 2014 /*year of first date*/
                DECLARE @MONTH INT = 6 /*month of first date*/
                DECLARE @DAY INT = 30 /*day of first date*/

  ;WITH      MONTHS (DATES) AS
            (select DATEFROMPARTS(@year,@month,@day)
            union all
            SELECT cast(DATEADD(dd,-1,DATEADD(mm, DATEDIFF(m,0,dateadd(month,3,dates))+1,0)) as date)
            FROM MONTHS
            WHERE DATES < dateadd(month,12,datefromparts(@year,@month,@day))
            )

    SELECT * FROM MONTHS

我在尝试弄清楚如何将其转换为 Netezza SQL 时遇到了麻烦。示例代码的输出如下所示:

>     DATES
>     2014-06-30
>     2014-09-30
>     2014-12-31
>     2015-03-31
>     2015-06-30

Netezza 目前不支持递归 CTE,因此这里有一个替代方案,希望能满足您的需求。此处使用 CTE 完全是无偿的,它代表您在 MS SQL 代码中使用的变量声明。

with starting_date(start_date) as
(
   select '2014-06-30'::date
)
select last_day(add_months(date_trunc('month', start_date), idx*3 )) qtr_date
from starting_date
   cross join _v_vector_idx
where qtr_date <= add_months(start_date,12)
-- where idx < 5
order by qtr_date ;

  QTR_DATE
------------
 2014-06-30
 2014-09-30
 2014-12-31
 2015-03-31
 2015-06-30
(5 rows)

where 子句的注释版本会更有效,但我使用了另一个版本以更接近您的原始版本。