日期Netezza SQL的递归CTE

时间:2015-11-20 15:38:37

标签: sql sql-server netezza

我在SQL Server上运行以下代码 - 它返回一个月的最后一天的季度日期表,从用户定义的第一个日期开始。我需要在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

1 个答案:

答案 0 :(得分:2)

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子句的注释版本会更有效率,但我使用其他版本更接近原始版本。