プログラマーの開発メモ

ソフトウェアエンジニアの覚え書き

【SQL】ISO規格の日付書式(IYYY、IW) と YYYY、WW

2006年06月22日 18時24分47秒 | SQL
年における週番号をとる際など下記の日付書式に注意

「YYYY」と「IYYY」
「WW」と「IW」

Oracleリファレンスによると、下記のように定義されている。
YYYY・・・4桁で表した年
IYYY・・・ISO規格に基づく4桁の年
WW・・・年における週(1~53)。第1週はその年の1月1日で始まり、1月7日で終了します。
IW・・・ISO規格に基づく、年における週(1~52または1~53)


ISO規格の「週」の定義は、「常に月曜日で始まって日曜日に終わる」。
ISO規格では、ISO週番号に関連する年が暦年と異なることがある。

1月1日が金~日の場合、1月1日を含む週は、前年の最後の週になる
1月1日が月~木の場合、1月1日を含む週は、新しい年の最初の週になる。


例えば、
■2006年1月1日はISO規格だと2005年の52週目となる。
SQL> select to_char(to_date('2006/01/01', 'yyyy/mm/dd'), 'iyyy-iw') as ISO_WK from dual;

ISO_WK
-------
2005-52

■2007年12月31日はISO規格だと2008年の1週目となる。
SQL> select to_char(to_date('2007/12/31', 'yyyy/mm/dd'), 'iyyy-iw') as ISO_WK from dual;

ISO_WK
-------
2008-01


これを、YYYYWW形式でやってみると、
■2006年1月1日はYYYYWWだと2006年の1週目となる。
SQL> select to_char(to_date('2006/01/01', 'yyyy/mm/dd'), 'yyyy-ww') as YYYY_WW from dual;

YYYY_WW
-------
2006-01

■2007年12月31日はYYYYWWだと2007年の53週目となる。
SQL> select to_char(to_date('2007/12/31', 'yyyy/mm/dd'), 'yyyy-ww') as YYYY_WW from dual;

YYYY_WW
-------
2007-53

WWは1月1日から7日づつ区切った週の番号になる。



★★YYYYとIWを組み合わせてしまったり、IYYYとWWを組み合わせてしまうと危険である。★★

SQL> select to_char(to_date('2006/01/01', 'yyyy/mm/dd'), 'yyyy-iw') as YYYY_IW from dual;

YYYY_IW
-------
2006-52    ←2006/01/01が2006年の52週目になってしまった

SQL> select to_char(to_date('2006/01/01', 'yyyy/mm/dd'), 'iyyy-ww') as IYYY_WW from dual;

IYYY_WW
-------
2005-01    ←2006/01/01が2005年の1週目になってしまった