- ベストアンサー
ORA-01843: 指定した月が無効です。エラー
- データベースに数値型の日付があるのですが、これを日付型にして表示しようとすると「ORA-01843: 指定した月が無効です」となってしまいます。
- 多分、数値が6桁になっているデータだと思います 940101 990201 です。
- 検索してみて ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; を実行しても結果は同じでした。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
B13をすべてチェックしてみてください。 恐らく、年月日にマッチしないデータがあるんだと思います。 例)940101→1994年01月01日 ○ 940000→1994年00月00日 × 940132→1994年01月32日 × 以下、試した結果です。 SQL> SELECT TO_DATE(TO_CHAR(940101, '000000'),'RRMMDD') FROM DUAL ; TO_DATE( -------- 94-01-01 SQL> SELECT TO_DATE(TO_CHAR(940131, '000000'),'RRMMDD') FROM DUAL ; TO_DATE( -------- 94-01-31 SQL> SELECT TO_DATE(TO_CHAR(940132, '000000'),'RRMMDD') FROM DUAL ; SELECT TO_DATE(TO_CHAR(940132, '000000'),'RRMMDD') FROM DUAL * 行1でエラーが発生しました。: ORA-01847: 月単位の日付は1から月末日の間で指定する必要があります SQL> SELECT TO_DATE(TO_CHAR(940000, '000000'),'RRMMDD') FROM DUAL ; SELECT TO_DATE(TO_CHAR(940000, '000000'),'RRMMDD') FROM DUAL * 行1でエラーが発生しました。: ORA-01843: 指定した月が無効です。 如何でしょうか。
その他の回答 (3)
- Tiffa9900
- ベストアンサー率31% (68/216)
度々すみません。 下記の2コマンドの結果を教えて頂けないでしょうか。 DESCRIBE NSEKIB ※見たいのはB13の詳細なタイプなのですが。 SELECT B13 FROM NSEKIB WHERE B02 = 0096 お願い致します。
補足
早速、ありがとうございます。 DESCRIBE NSEKIB 名前 NULL? 型 ------ -------- ------------- BKEY NOT NULL CHAR(11) B01 CHAR(7) B02 CHAR(4) B03 VARCHAR2(32) B04 VARCHAR2(50) B05 NUMBER(6) B06 VARCHAR2(20) B12 NUMBER(10) B13 NUMBER(6) B14 NUMBER(6) です。 よろしくお願いします。
- Tiffa9900
- ベストアンサー率31% (68/216)
一点確認させてください。 > 結果、数件は表示されます > 多分、数値が6桁になっているデータだと思います これは、6桁はすべて表示され、それ以外は表示されないと言う事でしょうか。 また、上記とした場合、表示されない時はどういったデータなのでしょうか。 例)2000/01/01 は 000101 ?
補足
早速ありがとうございます。 表示されないのはどんなものか調べていましたが、数値を指定するとうまくいきますが、データ上ではエラーになります。 そこでwhere文で行を指定してみましたらすべてエラーになります。(B02:NO) SQL> SELECT TO_DATE(TO_CHAR('940101'),'RRMMDD'),B02 FROM NSEKIB where B02 = 0096 TO_DATE( B02 -------- ---- 94-01-01 0096 SELECT TO_DATE(TO_CHAR(B13,'000000'),'RRMMDD'),B02 FROM NSEKIB where B02 = 0096 ERROR: ORA-01843: 指定した月が無効です。 です。 B13は数値型で'940101'になっています。 ちなみに SQL> SELECT TO_DATE(TO_CHAR('101'),'RRMMDD'),B02 FROM NSEKIB where B02 = 0096 TO_DATE( B02 -------- ---- 00-01-01 0096 でOKです。
- Tiffa9900
- ベストアンサー率31% (68/216)
数値が6桁じゃなくて、8桁なのではないでしょうか。確認してみてください。 環境は若干違いますが、下記の3通りのクエリを試した結果を記載します。 3つ目の関数であれば、うまくいくような気がします。 SQL> SELECT TO_DATE(TO_CHAR(940101,'000000'),'RRMMDD') FROM DUAL ; TO_DATE( -------- 94-01-01 SQL> SELECT TO_DATE(TO_CHAR(19940101,'000000'),'RRMMDD') FROM DUAL ; SELECT TO_DATE(TO_CHAR(19940101,'000000'),'RRMMDD') FROM DUAL * 行1でエラーが発生しました。: ORA-01841: (周)年は-4713と+9999の間の0以外の数字を指定する必要があります SQL> SELECT TO_DATE(TO_CHAR(19940101,'00000000'),'RRMMDD') FROM DUAL ; TO_DATE( -------- 94-01-01
お礼
回答中すいません。 どうやら、データの中に日付では表せないデータがあるようなのでもう一度このデータをしっかりさせてから質問し直します。 ありがとうございました。
補足
早速、返信ありがとうございます。 まず、桁数は6桁になっています。 3つ目の関数で実行しましたら、良い結果になりました。 SELECT TO_DATE(TO_CHAR(19940101,'00000000'),'RRMMDD') FROM DUAL ; しかし、実際のデータではエラーとなってしましました。 質問で「多分、数値が6桁になっているデータだと思います」 と言いましたが、データを見ると6桁になっているのに途中でエラーとなっているようです。 940125 940127
お礼
もう少し、詳しく見てみましたらやはりエラーになります。 今度は'0'のデータを削除しました(テストデータなので)が 途中まではうまくいきますがエラーが出てしまいます。 SELECT TO_DATE(TO_CHAR(B13,'000000'),'RRMMDD'),B02 FROM NSEKIB TO_DATE( B02 -------- ---- 97-03-30 0078 98-03-27 0079 98-03-24 0080 98-03-24 0081 98-02-27 0082 98-02-27 0083 98-02-27 0084 98-02-27 0085 98-02-27 0086 98-02-27 0087 ERROR: ORA-01843: 指定した月が無効です・ 1605行が選択されました。 ちなみにSELECT TO_DATE(TO_CHAR(B13,'000000'),'RRMMDD'),B02 FROM NSEKIB order by B13 order by B13をつけると、すべてエラーになります。 ERROR: ORA-01843: 指定した月が無効です・
補足
ありがとうございます。 データ B02 B13 0011 921 0014 0 SELECT TO_DATE(TO_CHAR(B13,'000000'),'RRMMDD'),B02 FROM NSEKIB where B02 = 0014 B02 = 0011(※) TO_DATE( B02 -------- ---- 00-09-21 0011 B02 = 0014(※) 行1でエラーが発生しました。: ORA-01843: 指定した月が無効です もう少し、詳しく見てみますが、おそらくB13が'0'のデータがエラーになっているようです。