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