闲来无事,玩起Linux的cal命令,显示出某年某月的月历。尝试着用SQL语句写了一个类似的功能,有不完善的地方,请诸位大师指点!

 查询某年某月的月历,输入字符串类型YYYYMM(比如'201102'表示2011年2月份):

  1. select max(decode(wk, 1, d)) Sun,  
  2.        max(decode(wk, 2, d)) Mon,  
  3.        max(decode(wk, 3, d)) Tue,  
  4.        max(decode(wk, 4, d)) Wed,  
  5.        max(decode(wk, 5, d)) Thu,  
  6.        max(decode(wk, 6, d)) Fri,  
  7.        max(decode(wk, 7, d)) Sat  
  8.   from (select to_char(rownum, '00') d,  
  9.                trunc((to_number(to_char(to_date('201109' || '01'), 'D')) + rownum - 2) / 7) p,  
  10.                to_char(to_date('201109' || '01') + rownum - 1, 'D') wk  
  11.           from dual  
  12.         connect by rownum <= to_number(to_char(last_day(to_date('201109' || '01')),'DD'))) t  
  13.  group by p  
  14.  order by 7; 

查询某年的年历,输入字符串类型YYYY(比如'2008'表示2008年):

  1. select decode(row_number() over(partition by m order by p, m, 7),  
  2.               1, decode (m,  
  3.                          '01','Jan',  
  4.                          '02','Feb',  
  5.                          '03','Mar',  
  6.                          '04','Apr',  
  7.                          '05','May',  
  8.                          '06','Jun',  
  9.                          '07','Jul',  
  10.                          '08','Aug',  
  11.                          '09','Sep',  
  12.                          '10','Oct',  
  13.                          '11','Nov',  
  14.                          '12','Dec')) as Mon,  
  15.        max(decode(wk, 1, d)) Sun,  
  16.        max(decode(wk, 2, d)) Mon,  
  17.        max(decode(wk, 3, d)) Tue,  
  18.        max(decode(wk, 4, d)) Wed,  
  19.        max(decode(wk, 5, d)) Thu,  
  20.        max(decode(wk, 6, d)) Fri,  
  21.        max(decode(wk, 7, d)) Sat  
  22.   from (select d,m,wk,  
  23.                trunc((p - 2 + row_number() over(partition by m order by d)) / 7) as p  
  24.           from (select to_char(to_date('2008' || '01' || '01') + rownum - 1, 'DD') d,  
  25.                        to_char(to_date('2008' || '01' || '01') + rownum - 1, 'MM') m,  
  26.                        to_char(trunc(to_date('2008' || '01' || '01') + rownum - 1, 'MM'), 'D') p,  
  27.                        to_char(to_date('2008' || '01' || '01') + rownum - 1, 'D') wk  
  28.                   from dual  
  29.                 connect by to_date('2008' || '01' || '01') + rownum - 1 <  
  30.                            to_date('2008' || '01' || '01') + interval '1' year) a) b  
  31.  group by m, p; 

展示结果:

 

Oracle SQL语句查询日历_Oracle  Oracle SQL语句查询日历_Oracle_02Oracle SQL语句查询日历_Oracle_03