oracle 获取日期属于哪一年的哪一周

最近做了一个按周为周期做的统计,即以周为列名做group by从而获取有效数据的数量。

以上描述有点乱七八糟的,直接说这里要做什么吧。目标:获取某个日期属于哪一年的哪一周,即标题。哈哈~

这里需要用到Oracle中的to_char函数,且传入格式“IW”即可获取ISO标准的周。下面是关于IW的介绍:

IW : 
    以周别为“主线” ,每年最多可以有53个周B别,但是每年至少要包含52个周别; 
如果一年当中第52周别之后至当年的12月31日之间,还有大于或等于4天的话,则定为当年的第53周,否则剩余这些天数被归为下一年的第1周;如果在不足52周别的话,则以下一年的时间来补;每周固定的从周一开始作为本周的第1天,到周日作为本周的第7天;比如:在Oracle中 2006/01/01 依然属于IW周别 05年的第52周的第7天 

本来我以为使用下面这条语句就万事大吉的。

with t as
 (select to_date('2015-01-01', 'yyyy-MM-dd') test_time from dual)
select TO_CHAR(t.test_time, 'IW-YYYY') column_name
  from t;
这样可以得到“01-2015”,表示2015年的第一周。但我将那个日期改成"2014-12-29",天啊,居然得到"01-2014",按ISO的标准来说这一天应该为2015的第一周的。

经过一番对Google大神的求助,我了解到每年的最后3天(即12-29,12-30,12-31)有可能为本年的第53周,也有可能为下一年的第一周,当然也有可能为本年的第52周,而每年的前3天(即1-1,1-2,1-3)有可能为上年的第53周,本年的第一周。因此,我将sql改成下面的样子:

with t as
 (select to_date('2005-01-01', 'yyyy-MM-dd') test_time from dual)
select (TO_CHAR(t.test_time, 'IW') || '-' || case
         when to_char(t.test_time, 'MM-dd') in ('12-29', '12-30', '12-31') and
              TO_CHAR(t.test_time, 'IW') = '01' then
          TO_CHAR(add_months(t.test_time, 12), 'YYYY')
         when to_char(t.test_time, 'MM-dd') in ('01-01', '01-02', '01-03') and
              TO_CHAR(t.test_time, 'IW') = '53' then
          TO_CHAR(add_months(t.test_time, -12), 'YYYY')
         else
          TO_CHAR(t.test_time, 'YYYY')
       end) column_name
  from t;
这样,2005年1月1日获取到的即为ISO标准的2004年的第53周啦。

若有不好的地方,还请多多指正,谢谢!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值