Oracle日期周详解以及周开始结束时间计算
1 ORACLE中周相关知识描述
1.1 日期格式化函数
TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串。X是一个日期,FORMAT是一个规定了X采用何种格式转换的格式字符串,FORMAT与周相关的有W,WW,IW,D,FMWW。
W 的含义是一个月的第几周。是按照ORACLE自定义的标准周来返回周数。
IW是ISO标准周,它的含义是ISO标准周以周别为“主线”,每年最多可以有53个周别,但是每年至少要包含52个周别;如果一年当中第52周别之后至当年的12月31日之间,还有大于或等于4天的话,则定为当年的第53周,否则剩余这些天数被归为下一年的第1周;如果在不足52周别的话,则以下一年的时间来补;每周固定的从周一开始作为本周的第1天,到周日作为本周的第7天;比如:在Oracle中 2012年01月01号依然属于IW周别2011年的第52周的第7天。这个用到的比较多。
WW是ORACLE自定义的标准周,它的含义是每年的1月1日作为当年的第一周的第一天(不管当年的1月1日是星期几);比如:2014年01年01是周三,在Oracle中被定义为2014年WW的第一周的第一天。一般很少用到。
D是返回当前日期是这个星期的第几天。是按照从周日到周六来进行计算的,这是要注意的地方。
FMWW该年1月1号(不考虑属星期几)开始至该年该一个星期日为第一周,第二周是从该年第一个星期开始算(这与IW算法相同)一年的最后一周以该年的12月31号做为截止。
1.2 日期时间运算函数
NEXT_DAY(X,Y):用于计算X时间后第一个星期Y的时间。Y是一个字符串,表示用当前会话语言表示的一周中某一天的全称(如星期一、星期二等),也可以是数值。
TRUNC(X [,FORMAT]):截断日期, FORMAT 中与周相关的有D,IW,WW,W,FMWW。
W 的含义是一个月的第几周。是按照ORACLE自定义的标准周来返回的是一个周数。
IW是ISO标准周,返回是的当前日期所在周的周一。
WW是ORACLE自定义的标准周。返回ORACLE自定义标准周所在的周一。
D 的含义是的返回当前星期的第一天。令人感到奇怪的是根据D返回的是当前星期的第一天是星期日。这点是我们要注意的地方。
FMWW该年1月1号(不考虑属星期几)开始至该年该一个星期日为第一周,第二周是从该年第一个星期开始算(这与IW算法相同)一年的最后一周以该年的12月31号做为截止。取周的开始时间时在跨年的时候与IW有些区别,比如2012年01年01使用FMWW的时候,周的开始时间是2012-01-01,使用IW时,周的开始时间是2011/12/26。
ROUND(X [,FORMAT]):日期的四舍五入FORMAT中与周相关的有DAY。按周一到周三和周四到周日四舍五入到最近的周日。
2 根据给定时间取一周的开始时间和结束时间
--取周的开始时间和结束时间
SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') AS STARTDATE FROM DUAL;--本周周一
SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') + 6 AS ENDDATE FROM DUAL;--本周周日SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') - 7 AS STARTDATE FROM DUAL;---上周周一
SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') - 1 AS ENDDATE FROM DUAL;--上周周日
3 根据给定周数取一周的开始时间和结束时间
取自然周的开始时间和结束时间的难点就需要判断年初的那几天是属于本年的第一周,还是属于上一年的最后一周,根据IW自然周的定义,少于等于3天是本年的话,属于上一年的最后一周,大于等于4天属于本年的话,加上上年的最后几天,算成本年的第一周。
--按照周一到周日为一周算周的开始时间和结束时间(IW)自然周
WITH PARAMS AS (SELECT TRUNC(TO_DATE('2009-01-01','YYYY-MM-DD'),'YYYY') AS SD FROM DUAL)
SELECT LEVEL 周次,
DECODE(SIGN(5-DECODE(TO_CHAR(PM.SD,'D'),'1','7',TO_CHAR(PM.SD,'D'))),-1,
NEXT_DAY(PM.SD+(LEVEL-1)*7,2),NEXT_DAY(PM.SD+(LEVEL-1)*7-7,2))当周第一天,
DECODE(SIGN(5-DECODE(TO_CHAR(PM.SD,'D'),'1','7',TO_CHAR(PM.SD,'D'))),-1,
NEXT_DAY(PM.SD+(LEVEL-1)*7,2),NEXT_DAY(PM.SD+(LEVEL-1)*7-7,2)) + 6
当周最后一天
FROM DUAL D
LEFT JOIN PARAMS PM ON 1=1
CONNECT BY LEVEL<=53
--按照周日到周六为一周算周的开始时间和结束时间(D)
SELECT LEVEL 周次,(TRUNC(TO_DATE('2011-01-01','YYYY-MM-DD'),'YYYY')-7) + (7-TO_CHAR(TRUNC(TO_DATE('2011-01-01','YYYY-MM-DD'),'YYYY'),'D')+1)+(LEVEL-1)*7 当周第一天,(TRUNC(TO_DATE('2011-01-01','YYYY-MM-DD'),'YYYY')-7) + (7-TO_CHAR(TRUNC(TO_DATE('2011-01-01','YYYY-MM-DD'),'YYYY'),'D')+1)+(LEVEL-1)*7+6 当周最后一天
FROM DUAL CONNECT BY LEVEL<=53
--按照ORACLE标准(WW)
SELECT LEVEL 周次,TO_DATE('2013-01-01','YYYY-MM-DD')+(LEVEL-1)*7 当周第一天,TO_DATE('2013-01-01','YYYY-MM-DD')+(LEVEL-1)*7+DECODE((TO_CHAR(TO_DATE('2013-12-31','YYYY-MM-DD'),'DDD')-(LEVEL-1)*7),1,0,2,1,6) 当周最后一天
FROM DUAL CONNECT BY LEVEL<=53
4 获取一年的最大周次
--获取一年中的最大周次(IW)中国日历自然周
WITH PARAMS AS (SELECT '2014' AS NF FROM DUAL)
SELECT TO_CHAR(TO_DATE(PM.NF || '-12-28','YYYY-MM-DD'),'IYYYIW') FROM DUAL LEFT JOIN PARAMS PM ON 1=1
上述SQL通过卡每年的12月28号属于哪个周,也判断一年有多少个自然周。
5 特别应该注意的地方
取周别的时候最好把年份带上,第一因为周别是相对于哪年的第几周,第二因为当使用IW的时候对于一年的开始那几天和结束那几天可能会产生一样的周数,就分不清属于哪年的第一周。
Oracle日期周详解以及周开始结束时间计算相关推荐
- oracle时间开始结束时间,Oracle日期周详解以及周开始结束时间计算
1 Oracle中周相关知识描述 1.1 日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串.X是一个日期,FOR 1 Oracle中周相关知识描述 1.1 ...
- oracle的iw算法,[转载]Oracle日期周详解IW
1 ORACLE中周相关知识描述 1.1 日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串.X是一个日期,FORMAT是一个规定了X采用 ...
- java 根据时间范围自动算间隔_Java根据开始时间结束时间计算时间间隔 x年x月x日...
最近项目中有这样的需求:根据租赁开始时间租赁结束时间计算租期x年x月x日, 相同的需求还有根据出生日期计算年龄等等...... 例如:开始日期 2020年7月24日 结束日期 2021年9月3日 ...
- JAVA 给定开始时间和结束时间计算天数
1.给定开始时间和结束时间计算天数 package com.ceshi;import java.text.ParseException; import java.text.SimpleDateForm ...
- python输入日期计算天数_用python计算日期(1、返回指定日期所在的一周,2,计算一个日期的月份和天数加减)...
放两个小轮子吧,欢迎测试bug,然后告诉我: 1.返回指定日期所在的一周 2,计算一个日期的月份和天数加减 # -*- coding: utf-8 -*- """ Cre ...
- js通过开始时间和结束时间计算出中间的所有日期,并且转换为层级结构数组对象,用于甘特图头部日期数据
写在前面: 先看下最终数据结构展示 time('2020-10-01', '2021-01-06') 需要根据一个开始日期和一个结束日期最后返回以下数组对象 [最外层数组里的每个对象代表了某一年的所有 ...
- java根据开始时间和结束时间计算中间间隔日期
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; impo ...
- python根据起始时间和结束时间计算时长
可以使用python的内置模块datetime来计算时长.首先将起始时间和结束时间都转换为datetime对象,然后使用它们之间的差值即可得到时长. 例如: from datetime import ...
- oracle 日期格式化 修改_java学习笔记:时间日期类
一.Date类 Date类表示时间日期类,属于java.util包,使用需要导包.需要了解的是,计算机中时间原点为:1970年1月1日 00:00:00,了解一下这个时间就好.时间换算单位为:1秒 = ...
最新文章
- ASP连接Access2013
- java配置解决方法_如何配置Java环境变量及可能出现问题的解决方法
- C#中的 具名参数 和 可选参数
- java用do while语句逆序输出_跟我学java编程—深入理解do-while循环语句的用法
- android gradle build process
- 大剑无锋之已知后续遍历bfegcda,中序badefcg,前序是?【面试推荐】
- linux 版本的scipy,linux安装scipy
- hadoop fs:du统计hdfs文件(目录下文件)大小的用法
- countdownlatch的使用详解(好懂!!)
- [leetcode]146. LRU缓存机制
- LNMP状态管理命令
- python 日期操作【转】
- 中国能源统计年鉴面板数据-分省市主要污染物排放指标(包含ECXEL2020年中国统计年鉴)
- 微信公众平台开发者模式和编辑模式有什么用
- 虚拟机体验NAS私人云(第四篇):虚拟机安装群晖DSM7.01系统(附赠新版DS918+和DS3615xs启动映像)
- CAJ浏览器看论文如何设置背景为护眼色
- 电视盒子内存测试软件,目前最强的电视盒子?当贝超级盒子B1测评考验!
- 信号指示RSSI与显示格数关系
- vs2015遇见问题:后面有“::”的名称一定是类名或命名空间名
- 如何将普通相机改成VR相机