日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Oracle使用SQL語句生成日歷的實現(xiàn)方法

Oracle使用SQL語句可以實現(xiàn)日歷的功能,下面就為您詳細(xì)介紹Oracle使用SQL語句生成日歷的實現(xiàn)方法,希望對您能有所幫助。

1 要構(gòu)造某年某月的日歷,必須先知道這個月的開始時間,結(jié)束時間及天數(shù)
開始日期 例如 2006年11月

 
 
 
  1. select to_date('20061101','yyyymmdd') as startDayOfMon from  dual; 

結(jié)束日期

 
 
 
  1. select last_day(to_date('20061101','yyyymmdd')) as endDayOfMon from  dual; 

日期區(qū)間天數(shù)

 
 
 
  1. select last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1 as DayOfMon  
  2.   from dual; 

2 接下來就是需要得到開始時間到結(jié)束時間每一天的結(jié)果集

 
 
 
  1. select * from (  
  2. select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual  
  3.   connect by level <=   
  4.   (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)); 

3 再進(jìn)一步則是將該月中的日期分解成第幾周,星期幾。

 
 
 
  1. select everyDay,to_char(everyday,'yyyy') as 年,  
  2.    to_char(everyday,'mm') as 月,  
  3.    to_char(everyday,'dd') as 日,  
  4.    to_char(everyday,'dy') as 星期幾,  
  5.    lpad(to_char(everyday,'w'),6) as 該月的第幾周,  
  6.    lpad(to_char(everyday,'ww'),6) as 該年的第幾周  
  7.    from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual  
  8.   connect by level <=   
  9.   (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)); 

4 這個結(jié)果集求出來后,接下拉就是使用DECODE函數(shù)進(jìn)行行列轉(zhuǎn)換了

 
 
 
  1. select everyDay,to_char(everyday,'yyyy') as 年,  
  2.    to_char(everyday,'mm') as 月,  
  3.    to_char(everyday,'dd') as 日,  
  4.    to_char(everyday,'dy') as 星期幾,  
  5.    lpad(to_char(everyday,'w'),6) as 該月的第幾周,  
  6.    lpad(to_char(everyday,'ww'),6) as 該年的第幾周,  
  7.    lpad(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd')),3) as 星期日,  
  8.    lpad(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd')),3) as 星期一,  
  9.    lpad(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd')),3) as 星期二,  
  10.    lpad(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd')),3) as 星期三,  
  11.    lpad(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd')),3) as 星期四,  
  12.    lpad(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd')),3) as 星期五,  
  13.    lpad(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd')),3) as 星期六  
  14.     from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay from dual  
  15.   connect by level <=  
 
 
 
  1. (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)); 

5 再進(jìn)一步就是統(tǒng)計匯總了,大家發(fā)現(xiàn)一個小問題沒有?
  就是該月的第幾周這里是按本月開始是星期幾為開始的日期,很有意思,
  這樣我們按該日是該年的第幾周則是以今年開始日期是星期幾為開始日期

 
 
 
  1. select  to_char(everyday,'w') as week,  
  2.         sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,  
  3.         sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,  
  4.         sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,  
  5.         sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,  
  6.         sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,  
  7.         sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,  
  8.         sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六  
  9.     from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay   
  10.           from dual  
  11.           connect by level <= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)  
  12.         )  
  13.   group by to_char(everyday,'w'); 

6 以上日歷基本成功,但還有一個問題,就是一周的開始時間問題

 
 
 
  1. select  to_char(everyday,'ww') as week,  
  2.         sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,  
  3.         sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,  
  4.         sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,  
  5.         sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,  
  6.         sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,  
  7.         sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,  
  8.         sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六  
  9.     from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay   
  10.           from dual  
  11.           connect by level <= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)  
  12.         )  
  13.   group by to_char(everyday,'ww'); 

7  這樣雖然可以解決,但還存在問題,大家可以考慮下!也可以考慮下年歷怎么做!

 
 
 
  1. select  ceil((to_char(everyday,'dd')+(to_char(to_date('20061101','yyyymmdd'),'d')-1))/7) as week,  
  2.         sum(decode(to_char(everyday,'dy'),'星期日',to_char(everyday,'dd'))) as 星期日,  
  3.         sum(decode(to_char(everyday,'dy'),'星期一',to_char(everyday,'dd'))) as 星期一,  
  4.         sum(decode(to_char(everyday,'dy'),'星期二',to_char(everyday,'dd'))) as 星期二,  
  5.         sum(decode(to_char(everyday,'dy'),'星期三',to_char(everyday,'dd'))) as 星期三,  
  6.         sum(decode(to_char(everyday,'dy'),'星期四',to_char(everyday,'dd'))) as 星期四,  
  7.         sum(decode(to_char(everyday,'dy'),'星期五',to_char(everyday,'dd'))) as 星期五,  
  8.         sum(decode(to_char(everyday,'dy'),'星期六',to_char(everyday,'dd'))) as 星期六  
  9.     from(select to_date('20061101','yyyymmdd') + level - 1 as everyDay   
  10.           from dual  
  11.           connect by level <= (last_day(to_date('20061101','yyyymmdd')) - to_date('20061101','yyyymmdd') +1)  
  12.         )  
  13.   group by ceil((to_char(everyday,'dd')+(to_char(to_date('20061101','yyyymmdd'),'d')-1))/7); 

以上是最終的結(jié)果。

【編輯推薦】

教您如何實現(xiàn)Oracle模糊查詢

Oracle分頁查詢語句的寫法

Oracle sqlplus語句編輯命令

Oracle循環(huán)語句的寫法

Oracle修改用戶語法介紹


網(wǎng)站標(biāo)題:Oracle使用SQL語句生成日歷的實現(xiàn)方法
文章源于:http://www.5511xx.com/article/dpohego.html