ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

Oracleの日付書式"RR"と"YY"は4桁表記にも適用できる

Oracle Database の日時書式モデルは以下のように定義されている。

要素 説明
RR 2桁のみを使用して、21世紀に20世紀の日付を格納できます。
YY 年の2桁。

参考:書式モデル

実際には日付書式に"RR"と"YY"を指定しても、年に4桁を使用できる。

SQL> select TO_CHAR(TO_DATE('2014-11-01','RR-MM-DD'), 'YYYY-MM-DD') from DUAL;

TO_CHAR(TO_DATE('2014-11-01','
------------------------------
2014-11-01

SQL> select TO_CHAR(TO_DATE('2014-11-01','YY-MM-DD'), 'YYYY-MM-DD') from DUAL;

TO_CHAR(TO_DATE('2014-11-01','
------------------------------
2014-11-01

これはドキュメントに明示された仕様で、一部の書式(例えば"RR"と"YY")では一致しない場合に別の書式を試行する。

日時書式要素と日付文字列内の対応する文字の一致に失敗した場合、表2-18に示すとおり、元の書式要素のかわりに、別の書式要素の適用が試みられます。

表2-18 Oracleの書式一致(抜粋)

元の書式要素 元の書式要素のかわりに試行する書式要素
'YY' 'YYYY'
'RR' 'RRRR'
書式モデル

なお、"RRRR"と"YYYY"では年2桁の解釈が異なるので注意。

要素 説明
RRRR 年を丸めます。4桁または2桁で入力できます。2桁の場合、RRの場合と同様の結果が戻ります。年を4桁で入力すると、この処理は行われません。
YYYY 4桁で表した年。

参考:書式モデル

SQL> select TO_CHAR(TO_DATE('14-11-01','RRRR-MM-DD'), 'YYYY-MM-DD') from DUAL;

TO_CHAR(TO_DATE('14-11-01','RR
------------------------------
2014-11-01

SQL> select TO_CHAR(TO_DATE('14-11-01','YYYY-MM-DD'), 'YYYY-MM-DD') from DUAL;

TO_CHAR(TO_DATE('14-11-01','YY
------------------------------
0014-11-01

"14"が"RRRR"であれば西暦2014年と解釈されるのに対し、"YYYY"だと西暦14年と解釈される。

なお、Oracleは年の書式に4桁(YYYY)を推奨している。

年要素は、短いものではなく4桁のもの(YYYY)を使用することをお薦めしますが、その理由は次のとおりです。

  • 4桁の年要素ならば、あいまいさが排除されます。
  • 短い年要素は、問合せ最適化に影響を及ぼすことがあります(問合せコンパイルの時点では年が未知であり、実行時にならないと判明しないことがあるため)。
書式モデル