< 外部シンボル "_main" は未解決です | そういや、Oracleといえば、 >

December 1, 2003

(周)年は-4713と+9999の間で指定しなければなりませんが、0であってはなりません。

オラクルで、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

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?