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

来源:互联网 发布:精仿鞋淘宝店推荐 编辑:程序博客网 时间:2024/04/28 19:01

最近做了一个按周为周期做的统计,即以周为列名做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 0
原创粉丝点击