Sql 如何在Oracle中填充日历表?

Sql 如何在Oracle中填充日历表?,sql,database,oracle,Sql,Database,Oracle,我想在Oracle DB中维护一个日历表,我想用从2011年到2013年的一年中的所有日期填充该表,可能一直到任何一年。我该怎么做 假设my DB表有列,示例数据集为: S.No Cal_Dt DayName 1 01-01-2011 Monday 2 02-01-2011 Tuesday 3 03-01-2011 Wednesday 等等 我更关心Cal_Dt,只是这里DayName是可选的 declare v_date date := to_

我想在Oracle DB中维护一个日历表,我想用从2011年到2013年的一年中的所有日期填充该表,可能一直到任何一年。我该怎么做

假设my DB表有列,示例数据集为:

S.No  Cal_Dt      DayName 
1     01-01-2011  Monday
2     02-01-2011  Tuesday
3     03-01-2011  Wednesday
等等

我更关心Cal_Dt,只是这里DayName是可选的

declare
  v_date date := to_date('20110101','yyyymmdd');
begin

   while v_date < sysdate + 720 loop

      insert into calender
      values ( v_date, to_char(v_date,'DAY'));

      v_date := v_date + 1;

   end loop;
   commit;

end;
/

这不是最佳实践,您应该使用。只有在使用Oracle 9i或更早版本并填充大型表时,这才可能有用。

这是一种简单易行的方法

with calendar as (
        select :startdate + rownum - 1 as day
        from dual
        connect by rownum < :enddate - :startdate
    )
select rownum as "S.No", to_date(day,'dd_mm_yyyy') as "Cal_Dt", to_char(day,'day') as "DayName"
from calendar

如果我想从一年的第一天开始,而不是从sysdate开始,那么我想继续吗?@好极了,我已经编辑了它,这样你就可以在任何地方开始它。当在Oracle 11g中运行查询时,我得到一个错误ORA-00904:STARTDATE:无效标识符。输入日期格式为01012016。请帮助。您必须为您的特定情况使用有意义的值替换:startdate和:enddate。
with calendar as (
        select rownum - 1 as daynum
        from dual
        connect by rownum < sysdate - to_date('1-jan-2010') + 1
    )
select to_date('1-jan-2010') + daynum as monthdate
from calendar
;