Orace自定义“周”的开始和结束时间

日常学习小知识记录。

原文出处: http://www.itpub.net/thread-1944374-1-1.html

一、业务需求

业务上规定本周五到下周四为一个“周”,需求是任意给出一段时间,比如2015.10.01 -2015.12.23,按周汇总数据,也就是这段时间的:
第一周 100
第二周 150
第三周 160
.......
注意如果开始和结束的一周不足7天就不要统计了,忽略掉。就是要完整的周。例如10.01是周四,就不管它了,从10.02开始统计,到10.08算第一周。
怎么能标记出所给时间段的每一天算是第几周呢?谢了。

解决方法:
这个例子告诉你怎么算出掐头去尾的起止日期,然后又根据起始日期算出第几周:

(命令窗口执行)

VAR V_START VARCHAR2(10);
VAR V_END VARCHAR2(10);

EXEC :V_START:='2015.10.01';
EXEC :V_END:='2015.12.23';

WITH date_range as (
SELECT D1+5-W1 D1
      ,CASE WHEN W2>=4 THEN D2-(W2-4) ELSE D2-(W2+7-4) END D2
  FROM (select TO_DATE(:V_START,'YYYY.MM.DD') D1     ---开始时间格式调整
              ,to_char(TO_DATE(:V_START,'YYYY.MM.DD'),'DAY','NLS_DATE_LANGUAGE=''numeric date language''') W1   ---获取开始时间是周几
              ,TO_DATE(:V_END,'YYYY.MM.DD') D2
              ,to_char(TO_DATE(:V_END,'YYYY.MM.DD'),'DAY','NLS_DATE_LANGUAGE=''numeric date language''') W2
          FROM DUAL
       )
)
SELECT the_date,ceil((the_date-d1+1)/7) the_week
  FROM (
        SELECT D1+LEVEL-1 the_date,d1
          FROM date_range
        CONNECT BY LEVEL<=D2-D1+1  
       )
       ;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30260000/viewspace-1853206/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30260000/viewspace-1853206/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值