2015-11-20 3 views
1

У меня есть следующий код, который я запускаю на SQL Server - он возвращает таблицу квартальных дат в последний день месяца, начиная с определяемой пользователем первой даты. Мне нужно реализовать код в Netezza SQL:Рекурсивный CTE дат 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 
+0

Добавление образца вывода было бы полезно – ScottMcG

+1

только что отредактировано, чтобы добавить выходной образец. Спасибо за предложение @ScottMcG! – crayfishcray

ответ

1

Netezza в настоящее время не поддерживает рекурсивные КТР, так вот альтернатива, которая, мы надеемся работать для ваших нужд. Использование 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) 

Закомментированная версия, где положение будет более эффективным, но я использовал другую версию, чтобы более тесно рублю с оригиналом.

Смежные вопросы