日期与期别对照表

--drop table t_period purge;
--1、建表
create table t_period
(
  period VARCHAR2(10) not null,
  type   NUMBER(1) not null,--type:'1月 2季 3年 4天 5周'
  yw     VARCHAR2(10),  --一年中第几周
  mw     VARCHAR2(10),  --一月中第几周
  min_day  VARCHAR2(10),--期别开始日期
  max_day  VARCHAR2(10),--期别结束日期
  day    DATE,
  constraint PK_t_period primary key (TYPE, PERIOD)
);
  
--2、插入日初始数据
declare
  d date := to_date('2010-01-01', 'yyyy-mm-dd');
begin
  for i in 1 .. 7305 loop --10年1月1日到29年12月31日,共20年
    insert into t_period(period, type, day)values(to_char(d, 'yyyy-mm-dd'), 4, d);
    d := d + 1;
  end loop;
end;
commit;
  
--3、更新年周
/*1月1日在用iw转换的时候可能是上一年的第52周或第53周
select to_char(to_date('2010-01-01', 'yyyy-mm-dd'), 'yyyy-iw') as w10,
       to_char(to_date('2011-01-01', 'yyyy-mm-dd'), 'yyyy-iw') as w11,
       to_char(to_date('2012-01-01', 'yyyy-mm-dd'), 'yyyy-iw') as w12,
       to_char(to_date('2012-12-31', 'yyyy-mm-dd'), 'yyyy-iw') as w1212,
       to_char(to_date('2013-01-01', 'yyyy-mm-dd'), 'yyyy-iw') as w13,
       to_char(to_date('2013-12-31', 'yyyy-mm-dd'), 'yyyy-iw') as w1312,
       to_char(to_date('2014-01-01', 'yyyy-mm-dd'), 'yyyy-iw') as w14
  from dual;
*/
update t_period
   set yw = to_number(to_char(day, 'yyyy')) + case
              when to_char(day, 'mm') = '12' and
                   to_char(day, 'iW') = '01' then
               1
              when to_char(day, 'mm') = '01' and
                   to_char(day, 'iW') > '50' then
               -1
              else
               0
            end || '-' || to_char(day, 'iW');
commit;
       
--4、插入月份数据
insert into t_period
  (period, type)
  select distinct to_char(day, 'yyyy-mm'), 1
    from t_period
   where type = 4;
  
--5、插入季度数据
insert into t_period
  (period, type)
  select distinct to_char(day, 'yyyy-"Q"q'), 2
    from t_period
   where type = 4;
  
--6、插入年份数据
insert into t_period
  (period, type)
  select distinct to_char(day, 'yyyy'), 3 from t_period where type = 4;
commit;
  
--7、更新月周
--每天属于月份第几周
declare
  --2010-01-01为12-W5
  w integer := 5; --当月第几周
  mm varchar2(2) := '12';    --月份
begin
  for cur in (select t.rowid,t.* from t_period t where type=4 order by period)
  loop
    
    --逢周一时周会变化,月可能不变
    if 2 = to_char(cur.day,'d') then
      w := w+1;
      mm := to_char(cur.day,'mm');
      
      --周四在下月,当月最后一周小于4天算到下月第一周
      if to_char(cur.day, 'mm') <> to_char(cur.day + 3, 'mm') then
        w := 1;
        mm := to_char(add_months(cur.day, 1),'mm');
      end if;
      
      --周四在上月
      if to_char(cur.day, 'mm') <> to_char(cur.day - 4, 'mm') then
        w := 1;
      end if;
      
    end if;
  
    update t_period set mw = mm || '-W' || w where rowid = cur.rowid;
  end loop;
end;
  
insert into t_period(period,type,mw)
select distinct yw, 5, mw from t_period where type = 4;
commit;
  
--8、更新周、季第一天和最后一天
begin
  for cur in (select min(period) p1, max(period) p2, yw
                from t_period
               where type = 4
               group by yw
              having count(*) = 7) loop
    update t_period
       set min_day = cur.p1, max_day = cur.p2
     where period = cur.yw
       and type = 5;
  end loop;
  
  for cur in (select min(period) p1,
                     max(period) p2,
                     to_char(day, 'yyyy-"Q"q') p
                from t_period
               where type = 4
               group by to_char(day, 'yyyy-"Q"q')) loop
    update t_period
       set min_day = cur.p1, max_day = cur.p2
     where period = cur.p
       and type = 2;
  end loop;
end;
  
--9、去掉过程列
alter table t_period drop column day;
  
select * from t_period order by type, period;

转载于:https://my.oschina.net/h2do/blog/268154

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值