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返回的是当前星期的第一天是星期日。这点是我们要注意的地方。

FMWW该年1月1号(不考虑属星期几)开始至该年该一个星期日为第一周,第二周是从该年第一个星期开始算(这与IW算法相同)一年的最后一周以该年的12月31号做为截止。取周的开始时间时在跨年的时候与IW有些区别,比如2012年01年01使用FMWW的时候,周的开始时间是2012-01-01,使用IW时,周的开始时间是2011/12/26。

ROUND(X [,FORMAT]):日期的四舍五入FORMAT中与周相关的有DAY。按周一到周三和周四到周日四舍五入到最近的周日。

2 根据给定时间取一周的开始时间和结束时间

  1. --取周的开始时间和结束时间
  2. SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') AS STARTDATE FROM DUAL;--本周周一
  3. SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') + 6 AS ENDDATE FROM DUAL;--本周周日
  4. SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') - 7 AS STARTDATE FROM DUAL;---上周周一
  5. SELECT TRUNC(TO_DATE('2014-07-18','YYYY-MM-DD'),'IW') - 1  AS ENDDATE FROM DUAL;--上周周日

3 根据给定周数取一周的开始时间和结束时间

取自然周的开始时间和结束时间的难点就需要判断年初的那几天是属于本年的第一周,还是属于上一年的最后一周,根据IW自然周的定义,少于等于3天是本年的话,属于上一年的最后一周,大于等于4天属于本年的话,加上上年的最后几天,算成本年的第一周。

  1. --按照周一到周日为一周算周的开始时间和结束时间(IW)自然周
  2. WITH PARAMS AS (SELECT TRUNC(TO_DATE('2009-01-01','YYYY-MM-DD'),'YYYY') AS SD FROM DUAL)
  3. SELECT LEVEL 周次,
  4. DECODE(SIGN(5-DECODE(TO_CHAR(PM.SD,'D'),'1','7',TO_CHAR(PM.SD,'D'))),-1,
  5. NEXT_DAY(PM.SD+(LEVEL-1)*7,2),NEXT_DAY(PM.SD+(LEVEL-1)*7-7,2))
  6. 当周第一天,
  7. DECODE(SIGN(5-DECODE(TO_CHAR(PM.SD,'D'),'1','7',TO_CHAR(PM.SD,'D'))),-1,
  8. NEXT_DAY(PM.SD+(LEVEL-1)*7,2),NEXT_DAY(PM.SD+(LEVEL-1)*7-7,2)) + 6
  9. 当周最后一天
  10. FROM DUAL D
  11. LEFT JOIN PARAMS PM ON 1=1
  12. CONNECT BY LEVEL<=53
  13. --按照周日到周六为一周算周的开始时间和结束时间(D)
  14. 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  当周第一天,
  15. (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 当周最后一天
  16. FROM DUAL CONNECT BY LEVEL<=53
  17. --按照ORACLE标准(WW)
  18. SELECT LEVEL 周次,TO_DATE('2013-01-01','YYYY-MM-DD')+(LEVEL-1)*7  当周第一天,
  19. TO_DATE('2013-01-01','YYYY-MM-DD')+(LEVEL-1)*7+
  20. DECODE((TO_CHAR(TO_DATE('2013-12-31','YYYY-MM-DD'),'DDD')-(LEVEL-1)*7),1,0,2,1,6) 当周最后一天
  21. FROM DUAL CONNECT BY LEVEL<=53

4 获取一年的最大周次

  1. --获取一年中的最大周次(IW)中国日历自然周
  2. WITH PARAMS AS (SELECT '2014' AS NF FROM DUAL)
  3. 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日期周详解以及周开始结束时间计算的更多相关文章

  1. Oracle日期周详解IW

    1 ORACLE中周相关知识描述 1.1           日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串.X是一个日期,FORMAT是一个规定了X采用 ...

  2. [转载]Oracle日期周详解IW

    1 ORACLE中周相关知识描述 1.1           日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串.X是一个日期,FORMAT是一个规定了X采用 ...

  3. Oracle日期周具体解释以及周開始结束时间计算

    1 ORACLE中周相关知识描写叙述 1.1           日期格式化函数 TO_CHAR(X [,FORMAT]):将X按FORMAT格式转换成字符串. X是一个日期,FORMAT是一个规定了 ...

  4. C#中周,月,第几周,周开始结束时间de方法总结

    1.c#获取当前时间是本年的第几周,本月的第几周 private static int getWeekNumInMonth(DateTime daytime) { int dayInMonth = d ...

  5. (干货)java中如何根据一个时间获取属于本年那一周,本周的开始时间以及最后一天时间。并且设置起始时间为周6.结束时间为周5

    本人亲测,有用,适用性比较强,直接上代码说话. package com.helloBike.data; import java.text.ParseException; import java.tex ...

  6. My97DatePicker日期控件,开始时间不能大于结束时间,结束时间不能小于开始时间

    在只做项目的时候,需要用到一个日期控件,之前用到过my97,感觉挺好的,兼容性很强,配置也比较容易 当开始时间不能大于结束时间和结束时间不能小于开始时间,这个需要一个判定的,要不然不就乱套了 在my9 ...

  7. php获取指定日期所在星期的开始时间与结束时间

    function getWeekRange($date){    $ret=array();    $timestamp=strtotime($date);    $w=strftime('%u',$ ...

  8. java根据开始时间结束时间计算中间间隔日期

    public static void main(String[] args) throws Exception { String beginDate = "2016-07-16"; ...

  9. ORACLE取周、月、季、年的開始时间和结束时间

     1           取周的開始时间和结束时间 取周的開始时间.以星期一为開始. SQL>SELECT TRUNC(TO_DATE('2013-11-25 10:31:11','YYYY ...

随机推荐

  1. .NET身份证验证

    身份证号码编码规则及校验位校验算法 算法地址:http://jingyan.baidu.com/article/7f41ececff944a593d095c8c.html 简单验证长度 /// < ...

  2. URAL 1658 Sum of Digits

    URAL 1658 思路: dp+记录路径 状态:dp[i][j]表示s1为i,s2为j的最小位数 初始状态:dp[0][0]=0 状态转移:dp[i][j]=min(dp[i-k][j-k*k]+1 ...

  3. Python的url解析库--urlparse

    一.urlparse解析url的query并构建字典 下面的方法主要的功能: 解析url的各个部分,并能够获取url的query部分,并把query部分构建成dict. 具体的代码实现: >&g ...

  4. SGE:qsub/qstat/qdel/qhost 任务投递和监控

    参考: Oracle Grid Engine qsub命令 SGE - qsub使用范例 SGE作业基本用法 qsub是最为稳定的底层任务投递系统,就是把一个脚本投递到集群的计算节点上运行. 注意,只 ...

  5. WPF使用Webbrowser操作网页的主要代码

    1,引用mshtml.dll using mshtml; 2,获取元素属性值 IHTMLDocument2 doc2=(IHTMLDocument)webbrowser1.Document; IHTM ...

  6. English trip -- VC(情景课)5 D

    Read 阅读 Listen and read. 听并读 Notice from Riverside Library Come and visit Riverside Library.The new ...

  7. python-day8-元组的内置方法

    #为何要有元组,存放多个值,元组不可变,更多的是用来做查询# t=(1,[1,3],'sss',(1,2)) #t=tuple((1,[1,3],'sss',(1,2)))# print(type(t ...

  8. 联想笔记本V470安装Win8.1 X64位系统,关机黑屏、电源灯亮

    以前的WIN7 X86系统用了很长时间了,软件业装了很多,现在使用的时候就有点卡了,最近决定重装个系统,后台发现开发的有一个东西要求WIN8 X64位的,就下载了一个准备直接安装了,也从此开始了整整2 ...

  9. 最齐全的Android studio 快捷键(亲测可用)

    Action Mac OSX Win/Linux 注释代码(//) Cmd + / Ctrl + / 注释代码(/**/) Cmd + Option + / Ctrl + Alt + / 格式化代码 ...

  10. dp练习(3)——棋盘问题

    设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如下图,在棋盘上有一个中国象棋马. 规定: 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2,求出马从x1,y1出发到x2, ...