设为首页 加入收藏

TOP

日期计算
2015-11-21 01:28:17 来源: 作者: 【 】 浏览:0
Tags:日期 计算
题目:如果这个月第一个星期的天数 <=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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle 数据库手动创建步骤 下一篇MySQL5.6关闭DNS查询

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: