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

本文详细介绍了如何使用Oracle的to_char函数计算特定日期属于哪一年的哪一周,特别关注了ISO标准周别计算中关于年末年初日期的特殊规则,并提供了解决方案以正确获取年份。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做了一个按周为周期做的统计,即以周为列名做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周啦。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值