简单的实现当月的日历,用decode函数:
select max(decode(to_char(s.day1,'d'),'2',s.day1,null)) mon,
max(decode(to_char(s.day1,'d'),'3',s.day1,null)) tur,
max(decode(to_char(s.day1,'d'),'4',s.day1,null)) wed,
max(decode(to_char(s.day1,'d'),'5',s.day1,null)) thr,
max(decode(to_char(s.day1,'d'),'6',s.day1,null)) fri,
max(decode(to_char(s.day1,'d'),'7',s.day1,null)) sat,
max(decode(to_char(s.day1,'d'),'1',s.day1,null)) sun
from (
select (trunc(sysdate,'mm')-1+level) day1 from dual connect by level<=(last_day(sysdate)-trunc(sysdate,'dd'))+1)
) s
group by to_char(s.day1,'iw')
order by to_char(s.day1,'iw')
解释:
1 其中可以先从最里面的查询说起:
trunc(sysdate,'dd')
sysdate是oracle的自动变量,表示系统时间,trunc是日期截取函数,'mm'表示截取到月,也就是当月第一天
last_day(sysdate)是当月最后一天
last_day(sysdate)-trunc(sysdate,'dd'))+1 结果是这个月的天数,例如10月有31天,则结果是31.
level是系统自带的,表示层次关系,是从1开始递增的,connect by是循环,
select (trunc(sysdate,'mm')-1+level) day1 from dual connect by level<=(last_day(sysdate)-trunc(sysdate,'dd'))+1)
整句的结果输出是竖列的从当月第一天开始到最后一天。
2 select 后面的属性:
to_char(s.day1,'d')是这个日期的星期几,按照西方标准算,周日是1,那么周一就是2。
decode(to_char(s.day1,'d'),'2',s.day1,null) 里面的第一个表达式和第二个表达式比较,如果相等,则输出第3个表达式,否则输出第4个表达式。
3 group by后面的
to_char(s.day1,'iw')结果是这个日期是第几周,从当年的第一天起,如2008年1月2号是第一周,2008年1月9号是第2周。