博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle日期周具体解释以及周開始结束时间计算
阅读量:5819 次
发布时间:2019-06-18

本文共 3140 字,大约阅读时间需要 10 分钟。

1 ORACLE中周相关知识描写叙述

1.1           日期格式化函数

TO_CHAR(X [,FORMAT]):将XFORMAT格式转换成字符串。

X是一个日期,FORMAT是一个规定了X採用何种格式转换的格式字符串,FORMAT与周相关的有WWWIWDFMWW

W 的含义是一个月的第几周。

是依照ORACLE自己定义的标准周来返回周数。

IWISO标准周,它的含义是ISO标准周以周别为主线。每年最多能够有53个周别。可是每年至少要包括52个周别;假设一年其中第52周别之后至当年的1231日之间,还有大于或等于4天的话,则定为当年的第53周,否则剩余这些天数被归为下一年的第1周。假设在不足52周别的话,则下面一年的时间来补。每周固定的从周一開始作为本周的第1天,到周日作为本周的第7天;比方:在Oracle 20120101号依旧属于IW周别2011年的第52周的第7天。这个用到的比較多。

WWORACLE自己定义的标准周。它的含义是每年的11日作为当年的第一周的第一天(无论当年的11日是星期几)。比方:20140101是周三,在Oracle中被定义为2014WW的第一周的第一天。

一般非常少用到。

D是返回当前日期是这个星期的第几天。

是依照从周日到周六来进行计算的,这是要注意的地方。

FMWW该年11号(不考虑属星期几)開始至该年该一个星期日为第一周。第二周是从该年第一个星期開始算(这与IW算法同样)一年的最后一周以该年的1231号做为截止。

1.2           日期时间运算函数

NEXT_DAY(X,Y)用于计算X时间后第一个星期Y的时间Y是一个字符串。表示用当前会话语言表示的一周中某一天的全称(如星期一、星期二等),也能够是数值。

TRUNC(X [,FORMAT]):截断日期, FORMAT 中与周相关的有DIWWWWFMWW

W 的含义是一个月的第几周。是依照ORACLE自己定义的标准周来返回的是一个周数。

IWISO标准周。返回是的当前日期所在周的周一。

WWORACLE自己定义的标准周。

返回ORACLE自己定义标准周所在的周一。

D 的含义是的返回当前星期的第一天。令人感到奇怪的是依据D返回的是当前星期的第一天是星期日。

这点是我们要注意的地方。

FMWW该年11号(不考虑属星期几)開始至该年该一个星期日为第一周,第二周是从该年第一个星期開始算(这与IW算法同样)一年的最后一周以该年的1231号做为截止。取周的開始时间时在跨年的时候与IW有些差别,比方20120101使用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 DLEFT JOIN PARAMS PM ON 1=1CONNECT 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通过卡每年的1228号属于哪个周,也推断一年有多少个自然周。

5   特别应该注意的地方

取周别的时候最好把年份带上,第一由于周别是相对于哪年的第几周。第二由于当使用IW的时候对于一年的開始那几天和结束那几天可能会产生一样的周数。就分不清属于哪年的第一周。

转载地址:http://rcwdx.baihongyu.com/

你可能感兴趣的文章
sed 在两行匹配之间插入一行
查看>>
手把手教你实现MySQL的主从复制及半同步复制
查看>>
keepalived+lvs
查看>>
学习安卓AndroidManifest.xml文件各项含义与使用方法
查看>>
KVM虚拟机获得宿主机指定网卡的流量
查看>>
完全卸载oracle11g步骤
查看>>
nginx日志分割脚本
查看>>
dedecms单页文档首页调用方法
查看>>
linux NFS 服务器的配置
查看>>
VMware虚拟机安装RedHat6.8
查看>>
我的友情链接
查看>>
Cisco交换机QOS限速
查看>>
Eclipse快捷键大全(转载)
查看>>
ubuntu设置开机默认进入字符界面方法
查看>>
windows2008安装多语言包界面
查看>>
awk -F选项同时指定多个符号做为分割符时遇到空格坑,题目:请执行命令取出 linux 中 eth0 的 IP 地址...
查看>>
vlan 基础知识
查看>>
PHP类中set和get方法解读
查看>>
webpack-dev-server 核心概念
查看>>
Office365 Exchange Hybrid No.12 Hybrid-04IMAP排错
查看>>