重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Oracle SQL实现日、月、周循环
站在用户的角度思考问题,与客户深入沟通,找到中宁网站设计与中宁网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、网站制作、企业官网、英文网站、手机端网站、网站推广、域名申请、雅安服务器托管、企业邮箱。业务覆盖中宁地区。
许多业务报表系统都是按日、月、周时间区间统计数据,通常都是通过job调用存储过程实现。
涉及到历史数据跑批时需要实现区间时间段按日、周、月循环。
具体你的周是怎么确定的?
select to_char(to_date('20090101','yyyymmdd')+rownum+7,'iw') column_name from dual connect by rownum=to_date('20111201','yyyymmdd')-to_date('20090101','yyyymmdd')
思路:
1. 用以上语句生成月份表(具体参数自己调一下)
2. 然后和你要统计的表进行外连接,不存在的就是null ,用nvl(null,0) 表示统计数据为0
参考:
oracle中如何获取中文的周数
默认oracle中,通过
select to_char(sysdate,'ww'),to_char(sysdate,'yyyy') from dual可以获取到ORACLE的周数,但是这个给的周数以及年数是按照每年的第一天为第一周的算法,和我们平常的计算方法不一样,平常的算法是按照星期来计算的,经过查找资料,to_char提供了新的参数:如下:
select to_char(sysdate,'iw'),to_char(sysdate,'iyyy') from dual
这个是按照IW = Week of year (1-52 or 1-53) based on the ISO standard
通常的ww是按照WW = Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
比如2008年12月31日,按照不同的查询方式的查询结果如下:
select to_char(to_date('2008-12,31', 'yyyy-mm-dd'), 'ww') ww,
to_char(to_date('2008-12,31', 'yyyy-mm-dd'), 'yyyy') yyyy
from dual
查询结果
序号 周 年度
1 53 2008
select to_char(to_date('2008-12,31', 'yyyy-mm-dd'), 'iw') iw,
to_char(to_date('2008-12,31', 'yyyy-mm-dd'), 'iyyy') iyyy
from dual
select max(years) || '年第' || week || '周',count(1)
from (select to_char(Y_TIME, 'yyyy') years,
to_char(Y_TIME+to_char(trunc(Y_TIME,'yyyy'),'d')-2,'WW') week
from T_B) group by week order by max(years),week
其中Y_TIME为你数据的时间字段,T_B为你要查询的表,查出每周数据量
查询结果示例如下:
2012年第31周 340
2012年第42周 6
2012年第43周 35
2012年第46周 7655
2013年第03周 18
2013年第04周 4
2013年第05周 2
2013年第06周 8
比如星期一到星期天算一周 查2011年7月完整周数 select max(count1) - 1 from (SELECT count(1) count1 FROM DUAL WHERE TO_CHAR(ADD_MONTHS(LAST_DAY(to_date('201107', 'yyyyMM')), -1) + LEVEL, 'DAY') = '星期一' CONNECT BY LEVEL
SELECT TO_CHAR(TO_DATE(20160316,'YYYYMMDD'),'W') FROM DUAL;
TO_CHAR函数可以获取某一天是在该月中的第几周,然后可以按照这个函数来分组了