程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 日期計算,日期計算器

日期計算,日期計算器

編輯:Oracle教程

日期計算,日期計算器


數據庫環境:Oracle 11g R2

     好久沒寫博客了,主要是遇到的一些需求都是之前在博客裡做過的,就懶得再整理了。

題目:如果這個月第一個星期的天數 <=3天,那麼這第一周要歸為上一個月。

    實現思路:

    1.生成本年的所有日期和日期對應的月份,所在周

    2.統計每個月份各周的天數

    3.如果第一周的天數<=3天,那麼月份-1

  下面是實現的SQL腳本,相關的注釋已在腳本裡說明

/*生年初日期和年末日期*/ with x0 as (select to_date('2015-01-01', 'yyyy-mm-dd') as 年初, to_date('2015-12-31', 'yyyy-mm-dd') as 年末 from dual), /*生成全年日期*/ x1 as (select 年初 + level - 1 as 日期 from x0 connect by level <= (年末 - 年初) + 1), /*計算日期所在的月份,所在周*/ x2 as ( select 日期, to_char(日期, 'mm') as 所在月份, to_char(日期, 'iw') as 所在周, to_number(to_char(日期, 'd')) 周幾 from x1), /*計算出每周是所在月份的第幾周和對應天數*/ x3 as ( select 日期, 所在月份, 所在周, dense_rank() over(partition by 所在月份 order by 所在周) as 本月第幾周, count(*) over(partition by 所在月份, 所在周) 本周天數, 周幾 from x2), /*按題目規則,處理月份*/ x4 as ( select 日期, 所在月份, 所在周, 本月第幾周, 本周天數, 周幾, case when 本月第幾周 = 1 and 本周天數 <= 3 then to_number(所在月份) - 1 else to_number(所在月份) end 名義月份 from x3) select 名義月份 as 月份, min(日期) as 月初, max(日期) as 月末 from x4 group by 名義月份 order by 1 View Code

    實現結果:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved