Sql 如何在Oracle中创建日历表

Sql 如何在Oracle中创建日历表,sql,oracle,Sql,Oracle,如何创建Oracle日历表。就像我有一张假期的桌子 Id FromDate ToDate Description 1 1-Feb-11 3-Feb-11 Maintance 3 2-Sep-09 5-Sep-09 Eid Holiday Fine Block 4 3-Dec-09 4-Dec-09 Due to System Problem 5 4-Dec-07 04-Dec-07 National Day 我想从这个表中

如何创建Oracle日历表。就像我有一张假期的桌子

Id  FromDate    ToDate  Description
1   1-Feb-11    3-Feb-11    Maintance
3   2-Sep-09    5-Sep-09    Eid Holiday Fine Block
4   3-Dec-09    4-Dec-09    Due to System Problem
5   4-Dec-07    04-Dec-07   National Day
我想从这个表中从最小起始日期和最大截止日期生成CTE

希望是桌上型的

Date        HolidayName

11-Feb-11   Maintance
12-Feb-11   Maintance
13-Feb-11   Maintance
02-Sep-09   Eid Holiday
03-Sep-09   Eid Holiday
04-Sep-09   Eid Holiday
05-Sep-09   Eid Holiday
可以使用connect by level子句:

 select FromDate+level-1 "Date", Description "HolidayName"
   from holiday 
connect by level <=  ToDate - FromDate + 1
  group by FromDate+level-1, Description
  order by 1;
可以使用connect by level子句:

 select FromDate+level-1 "Date", Description "HolidayName"
   from holiday 
connect by level <=  ToDate - FromDate + 1
  group by FromDate+level-1, Description
  order by 1;

在oracle 11g 2中,您可以使用CTE Recursive

像这样

WITH CTE(from_date, i, datediff,description) AS
(
  SELECT from_date, 1 AS i, trunc(to_date - from_date) as datediff,description
  FROM t
  UNION ALL
  SELECT from_date, i + 1, datediff,description
  FROM CTE
  WHERE i <= datediff
)
, dates as (select i, from_date + i - 1 as "Date",description from CTE)
SELECT "Date",description "HolidayName"
FROM dates
ORDER BY description desc

Sqlfiddle:

在oracle 11g 2中,可以使用CTE Recursive

像这样

WITH CTE(from_date, i, datediff,description) AS
(
  SELECT from_date, 1 AS i, trunc(to_date - from_date) as datediff,description
  FROM t
  UNION ALL
  SELECT from_date, i + 1, datediff,description
  FROM CTE
  WHERE i <= datediff
)
, dates as (select i, from_date + i - 1 as "Date",description from CTE)
SELECT "Date",description "HolidayName"
FROM dates
ORDER BY description desc
Sqlfiddle: