iyyy、yyyy、ww、iw之间的区别及注意的地方

首先看一段来自官网的信息

SYYYY
YYYY
YEAR
SYEAR
YYY
YY
Y

Year (rounds up on July 1)

IYYY
IY
IY
I

ISO Year

Q

Quarter (rounds up on the sixteenth day of the second month of the quarter)

MONTH
MON
MM
RM

Month (rounds up on the sixteenth day)

WW

Same day of the week as the first day of the year

IW

Same day of the week as the first day of the ISO week, which is Monday

W

Same day of the week as the first day of the month

DDD
DD
J

Day

DAY
DY
D

Starting day of the week

HH
HH12
HH24

Hour

MI

Minute

 

在数据库的开发当中经常要对一些日期进行转换处理,比如取某年、某月,或者某周,每年的第一周的第一天等等,这种情况下就必须对orcale日期转换类型相当的熟悉。

下面详细介绍两组类型yyyy和iyyyy,ww和iw。

      经查看官网可知IYYY、IW指的是ISO的标准格式,而YYYY、WW是普通的日期格式,他们之间的区别在ISO标准认为日期是从周一到周日,按周计算,如果某一年的一月一号是周六或者周日,则某一年的第一周是延续上一年的周结束后算起,如果某一年的一月一号周二三四五,则该年的第一周从去年开始算起。而普通的标准则指定任何一年的一月一号都是周一,所以在使用日期的时候需要特别的注意,具体案列分析如下:

SQL> select to_char(date '2013-12-29','iyyy-mm'),to_char(date '2013-12-30','iyyy-mm'),to_char(date'2013-12-31','iyyy-mm') from dual;
 
TO_CHAR(DATE'2013-12-29','IYYY TO_CHAR(DATE'2013-12-30','IYYY TO_CHAR(DATE'2013-12-31','IYYY
------------------------------ ------------------------------ ------------------------------
2013-12                        2014-12                        2014-12
 
Executed in 0.015 seconds
 
SQL> select to_char(date '2013-12-29','day'),to_char(date '2013-12-30','day'),to_char(date'2013-12-31','day'),to_char(date'2014-01-01','day') from dual;
 
TO_CHAR(DATE'2013-12-29','DAY' TO_CHAR(DATE'2013-12-30','DAY' TO_CHAR(DATE'2013-12-31','DAY' TO_CHAR(DATE'2014-01-01','DAY'
------------------------------ ------------------------------ ------------------------------ ------------------------------
星期日                         星期一                         星期二                         星期三
 
Executed in 0.015 seconds 

SQL>  select to_char(date '2013-12-29','yyyy-mm'),to_char(date '2013-12-30','yyyy-mm'),to_char(date'2013-12-31','yyyy-mm') from dual;
 
TO_CHAR(DATE'2013-12-29','YYYY TO_CHAR(DATE'2013-12-30','YYYY TO_CHAR(DATE'2013-12-31','YYYY
------------------------------ ------------------------------ ------------------------------
2013-12                        2013-12                        2013-12
 
Executed in 0.015 seconds

 通过前两上2个sql,可以知道to_char(date '2013-12-30','iyyy-mm'),to_char(date '2013-12-31','iyyy-mm')求出的年月是2014-12月,而29号是2013-12月,这里并不是说得出的结果是错误的,而是oracle是以ISO标准计算值而导致没有达到的预期结果。相对应的,第三条sql的值就没有变成2014-12,而是2013-12。所以在使用的过程中要特别注意iyyy的使用。

其次再看下周数

SQL> select to_char(date '2013-12-29','iyyy-iw'),to_char(date '2013-12-30','iyyy-iw'),to_char(date'2013-12-31','iyyy-iw') from dual;
 
TO_CHAR(DATE'2013-12-29','IYYY TO_CHAR(DATE'2013-12-30','IYYY TO_CHAR(DATE'2013-12-31','IYYY
------------------------------ ------------------------------ ------------------------------
2013-52                        2014-01                        2014-01
 
Executed in 0.015 seconds
  
SQL> select to_char(date '2013-12-29','yyyy-ww'),to_char(date '2013-12-30','yyyy-ww'),to_char(date'2013-12-31','yyyy-ww'),to_char(date'2014-01-01','yyyy-ww') from dual;
 
TO_CHAR(DATE'2013-12-29','YYYY TO_CHAR(DATE'2013-12-30','YYYY TO_CHAR(DATE'2013-12-31','YYYY TO_CHAR(DATE'2014-01-01','YYYY
------------------------------ ------------------------------ ------------------------------ ------------------------------
2013-52                        2013-52                        2013-53                        2014-01
 
Executed in 0.031 seconds
 
SQL> select to_char(date '2013-12-29','day'),to_char(date '2013-12-30','day'),to_char(date'2013-12-31','day'),to_char(date'2014-01-01','day') from dual;
 
TO_CHAR(DATE'2013-12-29','DAY' TO_CHAR(DATE'2013-12-30','DAY' TO_CHAR(DATE'2013-12-31','DAY' TO_CHAR(DATE'2014-01-01','DAY'
------------------------------ ------------------------------ ------------------------------ ------------------------------
星期日                         星期一                         星期二                         星期三

 通过以上3个sql可以得知采用ww求周数时,周数和星期天数是对应不上的,且周数之间不存在连贯性,反观采用iw时,2013年和2014年交接时周数是连着的,且于星期数对应上,一般在开发过程中采用iw来求周数,而不是ww。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值