Oracle日期相关

Oracle中日期的表示:

select to_char(sysdate,'CC WW W D DDD YYYY/MM/DD year month day') FROM DUAL
其中
CC    为世紀
WW 为一年中的周
W      为一個月中的周
D       为星期几
DDD 为一年中的第几天
year   为年 
month 为月 
day      为星期几

SQL>   select to_char(sysdate,'day') from dual; 

IW,WW的区别

IW:ISO标准周
WW:oracle标准周
举例:
SELECT to_char(to_date('20051203','yyyymmdd'),'WW') "WW03",
       to_char(to_date('20051203','yyyymmdd'),'IW') "IW03",
       to_char(to_date('20051204','yyyymmdd'),'WW') "WW04",
       to_char(to_date('20051204','yyyymmdd'),'IW') "WW04",
       to_char(to_date('20051205','yyyymmdd'),'WW') "WW05",
       to_char(to_date('20051205','yyyymmdd'),'IW') "WW05"
FROM dual; 

Oracle中发现的WW和IW的规律
WW:
     每年的1月1日作为当年的第一周的第一天(不管当年的1月1日是星期几);
     比如:2004/01/01 是周四, 在Oracle中被定义为2004年WW的第一周的第一天;
     SELECT TO_CHAR(TO_DATE('20040101','YYYYMMDD'),'YY:WW'),TO_CHAR(TO_DATE('20040107','YYYYMMDD'),'YY:WW'),TO_CHAR(TO_DATE('20040108','YYYYMMDD'),'YY:WW') FROM DUAL;

IW :
    以周别为“主线” ,每年最多可以有53个周B别,但是每年至少要包含52个周别;
如果一年当中第52周别之后至当年的12月31日之间,还有大于或等于4天的话,则定为当年的第53周,否则剩余这些天数被归为下一年的第1周;如果在不足52周别的话,则以下一年的时间来补;每周固定的从周一开始作为本周的第1天,到周日作为本周的第7天;比如:在Oracle中 2006/01/01 依然属于IW周别 05年的第52周的第7天
SELECT TO_CHAR(TO_DATE('20051226','YYYYMMDD'),'IY:IW'),TO_CHAR(TO_DATE('20060101','YYYYMMDD'),'IY:IW') FROM DUAL;

 

关于Oracle to_char()函数中的IW,WW 周别显示 

=========================================================== 

作者: tolywang(http://tolywang.itpub.net)
发表于:2008.03.24 09:49
分类: Oracle数据库管理 
出处:http://tolywang.itpub.net/post/48/458073
--------------------------------------------------------------- 

查今天是 "今年的第几周 

  select to_char(sysdate,'ww') from dual; 

  或 

  select to_char(sysdate,'iw') from dual; 

  附注: 

上文所提之iwww格式在doc内解释如下 

  IW = Week of year (1-52 or 1-53) based on the ISO standard 

  WW = Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year. 

 

周日都是第12

select to_char(to_date('20080323','yyyymmdd'),'WW') from dual;

select to_char(to_date('20080323','yyyymmdd'),'IW') from dual; 

周一其中一个是 12 周,一个是第 13 周 。 按照中国习惯应该式 IW (ISO Standard Week ) 比较合适 。 

select to_char(to_date('20080324','yyyymmdd'),'WW') from dual;

select to_char(to_date('20080324','yyyymmdd'),'IW') from dual; 

tolywang 发表于:2008.03.24 09:49 ::分类: ( Oracle数据库管理 ) ::阅读:(2468) :: 评论 (2) :: 引用 (0) 

re: 关于Oracle to_char()函数中的IW,WW 周别显示 [回复

详细讲解Oracle数据库的周数计算” 

1、日期计算,算第n周的第一天及最后一天是几号。 

  1ww的算法为每年11日为第一周开始,date+6为每一周结尾 

  例如20050101为第一周的第一天,而第一周的最后一天为20050101+6=20050107 

  公式 每周第一天 :date + 周 * 7 - 7 

  每周最后一天:date + 周 * 7 - 1 

  你会发现怎么编排格式都会跑掉。 

  2、日期计算,算第n周的第一天及最后一天是几号。 1ww的算法为每年11日为第一周开始,date+6为每一周结尾 

  例如20050101为第一周的第一天,而第一周的最后一天为20050101+6=20050107 

  公式 每周第一天 :date + 周 * 7 - 7 

  每周最后一天:date + 周 * 7 - 1 

  如果以ww格式为主,第117周的起迄如下 

  127.0.0.1:asdb:WF>select to_date('20050101','yyyymmdd') + 1*7-7,to_date('20050101','yyyymmdd') + 1*7-1 from dual; 

  TO_DATE(' TO_DATE(' 

  01-JAN-05 07-JAN-05 

  127.0.0.1:asdb:WF>select to_date('20050101','yyyymmdd') + 17*7-7,to_date('20050101','yyyymmdd') + 17*7-1 from dual; 

  TO_DATE(' TO_DATE(' 

  23-APR-05 29-APR-05 

  Elapsed: 00:00:00.00 

  验证如下 

  127.0.0.1:asdb:WF>select to_char(to_date('20050422','yyyymmdd'),'ww') as weekn,to_char(to_date('20050423','yyyymmdd'),'ww') as week1,to_char(to_date('20050429','yyyymmdd'),'ww') as week2,to_char(to_date('20050430','yyyymmdd'),'ww') as weekn2 from dual; 

  WEEK WEEK WEEK WEEK 

  16 17 17 18 

  Elapsed: 00:00:00.00 

  127.0.0.1:asdb:WF> 

2iw的算法为星期一至星期日算一周,且每年的第一个星期一为第一周, 

   例如20050101为星期六,所以用iw的算法是前年的53周,而20050103之后才是第一周的开始。 

  公式 每周第一天 :next_day(date) + 周 * 7 - 7 

  每周最后一天:next_day(date) + 周 * 7 - 1 

  如果以iw格式为主,第117周的起迄如下 

  127.0.0.1:asdb:WF>select next_day(to_date('20050101','yyyymmdd'),'MONDAY')+ 1 * 7 - 7 as first_day,next_day(to_date('20050101','yyyymmdd'),'MONDAY')+ 1 * 7 - 1 as last_day from dual; 

  FIRST_DAY LAST_DAY 

  03-JAN-05 09-JAN-05 

  Elapsed: 00:00:00.00 

  127.0.0.1:asdb:WF> 

  127.0.0.1:asdb:WF>select next_day(to_date('20050101','yyyymmdd'),'MONDAY')+ 17 * 7 - 7 as first_day,next_day(to_date('20050101','yyyymmdd'),'MONDAY')+ 17 * 7 - 1 as last_day from dual; 

  FIRST_DAY LAST_DAY 

  25-APR-05 01-MAY-05 

  Elapsed: 00:00:00.00 

  127.0.0.1:asdb:WF> 

  验证如下 

  127.0.0.1:asdb:WF>select to_char(to_date('20050424','yyyymmdd'),'iw') as weekn,to_char(to_date('20050425','yyyymmdd'),'iw') as week1,to_char(to_date('20050501','yyyymmdd'),'iw') as week2,to_char(to_date('20050502','yyyymmdd'),'iw') as weekn2 from dual; 

  WEEK WEEK WEEK WEEK 

  ---- ---- ---- ---- 

  16 17 17 18 

  Elapsed: 00:00:00.00 

  3)其它: 

  A、查今天是 "本月的第几周 

  SELECT TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS "weekOfMon" from dual; 

  或 

  SELECT TO_CHAR(SYSDATE,'W') AS "weekOfMon" from dual; 

  B、查今天是 "今年的第几周 

  select to_char(sysdate,'ww') from dual; 

  或 

  select to_char(sysdate,'iw') from dual; 

  附注: 

  上文所提之iwww格式在doc内解释如下 

  IW = Week of year (1-52 or 1-53) based on the ISO standard 

  WW = Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.

tolywang 评论于:2008.03.24 10:02 

re: 关于Oracle to_char()函数中的IW,WW 周别显示 [回复

SQL> select to_char(to_date('2009-01-01','yyyy-MM-dd'),'iw') from dual;

TO_CHAR(TO_DATE('2009-01-01','
------------------------------
01
2009-01-012009年第一周,是星期四,如果按你给的IW 计算一周第一天,和最后一天来计算本年的第二周的第一天和最后一天,就相差一周
SQL> select to_char(next_day(to_date('2009-01-01','yyyy-MM-dd'),'星期一')+2*7-7,'yyyy-MM-dd') as firstDay,to_char(next_day(to_date('2009-01-01','yyyy-MM-dd'),'星期一')+2*7-1,'yyyy-MM-dd') as lastDay from dual;

FIRSTDAY LASTDAY
---------- ----------
2009-01-12 2009-01-18

SQL> select to_char(to_date('2009-01-12','yyyy-MM-dd'),'iw') from dual;

TO_CHAR(TO_DATE('2009-01-12','
------------------------------
03


随便介绍几个其它函数的用法: 
如获得完整的时间格式 
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

本月的天数 
SELECT to_char(last_day(SYSDATE),'dd') days FROM dual 
今年的天数 
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 
下个星期一的日期 
SELECT Next_day(SYSDATE,'monday') FROM dual

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值