首先看一段来自官网的信息
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和iyyy,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。