oracle iyyy、yyyy、ww、iw之間的區別


2022-01-01 IYYY顯示的是2021的第52周,YYYY顯示的是2022年的第52周

select to_char(to_date('2022-01-01','yyyy-mm-dd'), 'IYYY."W"iw') week_seq, trunc(to_date('2022-01-01','yyyy-mm-dd'), 'iw') Monday, trunc(to_date('2022-01-01','yyyy-mm-dd'), 'iw') + 6 Sunday from dual;

select to_char(to_date('2022-01-01','yyyy-mm-dd'), 'YYYY."W"iw') week_seq, trunc(to_date('2022-01-01','yyyy-mm-dd'), 'iw') Monday, trunc(to_date('2022-01-01','yyyy-mm-dd'), 'iw') + 6 Sunday from dual;

 

      經查看官網可知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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM