日期計算
題目:如果這個月第一個星期的天數 <=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