Oracle SQLにおけるyy
とrr
の日付マスクの理解
Oracle SQLで日付フォーマットを扱う際によくある質問があります: Oracleのyy
とrr
の日付マスクの違いは何ですか? この違いを理解することは、特に2桁の年フォーマットを扱う際に、クエリによって返される結果に劇的な影響を与えることがあります。これらの日付マスクを分解し、なぜ異なる結果を生成するかを明確にしましょう。
問題の説明
Oracle SQLで日付の操作や比較を行う際、文字列を日付フォーマットに変換する必要がある状況に直面することがあります。その目的のために、通常yy
とrr
の日付マスクが使用されます。
以下にその違いを示す2つの例を挙げます:
SELECT ename FROM emp WHERE hiredate = TO_DATE('01/05/81', 'dd/mm/yy');
SELECT ename FROM emp WHERE hiredate = TO_DATE('01/05/81', 'dd/mm/rr');
これらの2つのクエリは、“81"という年の解釈によって異なる結果を返すことがあります。
日付マスクの分解
yy
日付マスク
- 定義:
yy
マスクは2桁の年を入力することを許可します。 - 解釈: Oracleは自動的に2桁が現在の世代に関連していると仮定します。
- 例えば、現在の年が2023年であれば、
01/05/81
は2081年
と解釈されます。
- 例えば、現在の年が2023年であれば、
- 使用例: これにより、特に20世紀を指す日付に対して予期しない結果が生じることがあります。
rr
日付マスク
- 定義:
rr
マスクも2桁の年を受け入れますが、解釈の方法が異なります。 - 解釈: 2桁の年は丸められて完全な年を決定します:
- 50-99:
1950-1999
年として扱われます。 - 00-49:
2000-2049
年として扱われます。
- 50-99:
- 例: したがって、
01/05/81
は1981年
と解釈されるため、ほとんどの場合、意図した参照です。
例のまとめ
これらのマスクが出力にどのように影響するかをまとめてみましょう:
yy
を使用したクエリ:01/05/81
を2081年
と仮定し、ほとんどの場合において該当する雇用記録はありません。
rr
を使用したクエリ:- 同じ日付を
1981年
と見なし、emp
テーブルにおそらく雇用記録があります。
- 同じ日付を
結論
日付を含むOracle SQLクエリを作成する際に、yy
とrr
の違いを理解することは非常に重要です。yy
は将来の年を誤解釈させる可能性があるのに対し、rr
マスクはその丸めルールにより、より理にかなったアプローチを提供します。
正しいマスクを選ぶことで、データを誤って除外することを避け、SQLクエリが意図した結果を得られるようにします。歴史的データに関するほとんどのケースでは、明確さと正確さのためにrr
マスクが推奨されます。
2桁の年を扱う際には、データの文脈と現在の年を考慮して、誤解を避けるようにしてください。