两个日期之间的年份列表

问题描述:

我有一个包含开始日期和结束日期列的表格。 我的目标是让每一年在时间跨度为每一行的列表,以便两个日期之间的年份列表

+-------------------------+ 
| startdate | enddate | 
+------------+------------+ 
| 2004-08-01 | 2007-01-08 | 
| 2005-06-02 | 2007-05-08 | 
+------------+------------+ 

应该输出这样的:

+-------+ 
| years | 
+-------+ 
| 2004 | 
| 2005 | 
| 2006 | 
| 2007 | 
| 2005 | 
| 2006 | 
| 2007 | 
+-------+ 

我现在的问题建立在两个日期之间的年。我的第一种方法是使用UNION(日期的顺序是无关紧要的),但其间年份缺少在这种情况下...

Select 
    Extract(Year From startdate) 
From 
    table1 
Union 
Select 
    Extract(Year From enddate) 
From 
    table1 

感谢您的建议!

尝试此查询

; with CTE as 
     (
     select datepart(year, '2005-12-25') as yr 
     union all 
     select yr + 1 
     from CTE 
     where yr < datepart(year, '2013-11-14') 
     ) 
select yr 
from CTE 
+0

谢谢,这一个是我一直在寻找!结合@ lalit-kumar-b的答案。 – RalphP 2014-09-30 12:34:02

试试这个:

多年如下创建一个表:

CREATE TABLE tblyears(y int) 

INSERT INTO tblyears VALUES (1900); 
INSERT INTO tblyears VALUES (1901); 
INSERT INTO tblyears VALUES (1902); 

,并依此类推,直至

INSERT INTO tblyears VALUES (2100) 

所以,你我会写这个查询:

SELECT y.y 
FROM tblyears y 
JOIN table1 t 
ON y.y >= EXTRACT(year from startdate) 
AND y.y <= EXTRACT(year from enddate) 
ORDER BY y.y 

Show SqlFiddle

行发生器技术

SQL> WITH DATA1 AS(
    2 SELECT TO_DATE('2004-08-01','YYYY-MM-DD') STARTDATE, TO_DATE('2007-01-08','YYYY-MM-DD') ENDDATE FROM DUAL UNION ALL 
    3 SELECT TO_DATE('2005-06-02','YYYY-MM-DD') STARTDATE, TO_DATE('2007-05-08','YYYY-MM-DD') ENDDATE FROM DUAL 
    4 ), 
    5 DATA2 AS(
    6 SELECT EXTRACT(YEAR FROM STARTDATE) ST, EXTRACT(YEAR FROM ENDDATE) ED FROM DATA1 
    7 ), 
    8 data3 
    9 AS 
10 (SELECT level-1 line 
11 FROM DUAL 
12  CONNECT BY level <= 
13  (SELECT MAX(ed-st) FROM data2 
14  ) 
15 ) 
16 SELECT ST+LINE FROM 
17 DATA2, DATA3 
18 WHERE LINE <= ED-ST 
19 ORDER BY 1 
20/

    ST+LINE 
---------- 
     2004 
     2005 
     2005 
     2006 
     2006 
     2007 

6 rows selected. 

SQL>