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
- oracle 获取日期属于哪一年的哪一周
- 判断某一天是属于本月的哪一周
- 你的经济条件属于哪一种?
- 程序员的十层楼,你属于哪一层?
- 算法属于哪一学科的范畴?
- 你属于哪一类?
- 测试:你属于哪一级?
- 行百里者半九十 新疆属于哪一半?
- 路由协议属于哪一层?
- 判断哪一年的哪一月有几天
- 程序员的等级,各位属于哪一级的呢?
- 2014年将会被淘汰的八种人,你属于哪一种?
- 程序员的十种级别,看看你属于哪一种?
- 程序员的十种级别,看看你属于哪一种?
- 对照你的生日查查你属于哪一棵树
- 程序员的十种级别,看看你属于哪一种?
- 程序员的十种级别,看看你属于哪一种?
- 程序员的十种级别,看看你属于哪一种?
- mysql外网可以访问
- hive 第2天
- 用layer-list实现图片旋转叠加、错位叠加、阴影、按钮指示灯
- android binder简单理解二
- 求两点之间的直线距离
- oracle 获取日期属于哪一年的哪一周
- poj1191--棋盘分割(dp)
- 大型网站架构改进历程:存储的瓶颈(4)
- ffmpeg常用参数
- 图像水彩画处理
- java 边读边写 文件迁移
- 如何获取Android 的系统日志logcat
- 编写简单的网络爬虫
- ListView -- SimpleAdapter的使用