(周)年は-4713と+9999の間で指定しなければなりませんが、0であってはなりません。
- [Database]
オラクルで、CHAR(8)で年月日の区切りなしで日付を格納してる列を、TO_DATE, TO_CHARでSELECTすると、こんなエラーが出ました。
ORA-01841: (周)年は-4713と+9999の間で指定してください。0であってはなりません。
エラーメッセージを見てもさっぱりわけがわからないのですがたまたまデータが空白の行でした。そりゃあそうですね。
こんな感じで実行すると、同じエラーになりました。
CREATE TABLE SAMPLE_TABLE( CHAR_DATE CHAR(8) ) / INSERT INTO SAMPLE_TABLE VALUES(' ') / SELECT TO_CHAR(TO_DATE(CHAR_DATE, 'YYYYMMDD'), 'YYYY/MM/DD') AS FORMATED_DATE FROM SAMPLE_TABLE /
このエラーのわけがわからなくて、Web上の情報をあさったところ、面白い事例がありました。
SELECT TO_DATE(SYSDATE, 'YYYY/MM/DD') AS TODAY FROM DUAL /
SYSDATEはDATE型の値を返すので、このSQLはそもそも意味不明なのですが、まあ、TO_CHARの間違いとか、そんなかも。
エラーの起きる経緯は、TO_DATEは1個目の引数に文字列を取るので、SYSDATEのDATE型から、暗黙の変換が起こります。その際の変換書式には、NLS_DATE_FORMATが使用されますが、デフォルトでは'YY/MM/DD'なので、2000/12/31→00/12/31となり、YYYYと解釈しようとしたら年が00年になってしまうということらしいです。2000年限定ですね。
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/125
コメント