• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ORA-01843: 指定した月が無効です。エラー)

ORA-01843: 指定した月が無効です。エラー

このQ&Aのポイント
  • データベースに数値型の日付があるのですが、これを日付型にして表示しようとすると「ORA-01843: 指定した月が無効です」となってしまいます。
  • 多分、数値が6桁になっているデータだと思います 940101 990201 です。
  • 検索してみて ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; を実行しても結果は同じでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tiffa9900
  • ベストアンサー率31% (68/216)
回答No.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: 指定した月が無効です。 如何でしょうか。

noname#69946
質問者

お礼

もう少し、詳しく見てみましたらやはりエラーになります。 今度は'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: 指定した月が無効です・

noname#69946
質問者

補足

ありがとうございます。 データ 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'のデータがエラーになっているようです。

その他の回答 (3)

  • Tiffa9900
  • ベストアンサー率31% (68/216)
回答No.3

度々すみません。 下記の2コマンドの結果を教えて頂けないでしょうか。 DESCRIBE NSEKIB ※見たいのはB13の詳細なタイプなのですが。 SELECT B13 FROM NSEKIB WHERE B02 = 0096 お願い致します。

noname#69946
質問者

補足

早速、ありがとうございます。 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)
回答No.2

一点確認させてください。 > 結果、数件は表示されます > 多分、数値が6桁になっているデータだと思います これは、6桁はすべて表示され、それ以外は表示されないと言う事でしょうか。 また、上記とした場合、表示されない時はどういったデータなのでしょうか。 例)2000/01/01 は 000101 ?

noname#69946
質問者

補足

早速ありがとうございます。 表示されないのはどんなものか調べていましたが、数値を指定するとうまくいきますが、データ上ではエラーになります。 そこで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)
回答No.1

数値が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

noname#69946
質問者

お礼

回答中すいません。 どうやら、データの中に日付では表せないデータがあるようなのでもう一度このデータをしっかりさせてから質問し直します。 ありがとうございました。

noname#69946
質問者

補足

早速、返信ありがとうございます。 まず、桁数は6桁になっています。 3つ目の関数で実行しましたら、良い結果になりました。 SELECT TO_DATE(TO_CHAR(19940101,'00000000'),'RRMMDD') FROM DUAL ; しかし、実際のデータではエラーとなってしましました。 質問で「多分、数値が6桁になっているデータだと思います」 と言いましたが、データを見ると6桁になっているのに途中でエラーとなっているようです。 940125 940127