自分のお店を開く時の心構えとは? >>

TO_DATE関数を使用して文字を日付型に変換して表示させようと打っているのですが、エラーが出て困っています。
どこが間違っているのでしょうか?
回答のほど宜しくお願いいたします。
1 select to_date('1/OCT/2004', 'DD/MON/YYYY')
2* from dual
SQL> /
select to_date('1/OCT/2004', 'DD/MON/YYYY')
*
行1でエラーが発生しました。:
ORA-01843: 指定した月が無効です。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

テリトリが日本だと思いますから'MON'の部分は 10月と指定しないとエラーになってしまいます。


日付の言語指定は変更可能ですので、OCT が使用したい場合には、以下を参考にしてください。

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD';

セッションが変更されました。

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='JAPANESE';

セッションが変更されました。

SQL> SELECT TO_CHAR(SYSDATE, 'YYYY/MON/DD') FROM DUAL;

TO_CHAR(SYSDATE,'YYYY/MON/DD')
--------------------------------
2005/9月 /17

SQL> SELECT TO_DATE('01/10月/2005', 'DD/MON/YYYY') FROM DUAL;

TO_DATE('0
----------
2005/10/01

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';

セッションが変更されました。

SQL> SELECT TO_CHAR(SYSDATE, 'YYYY/MON/DD') FROM DUAL;

TO_CHAR(SYSDATE,'YYYY/MON/DD
----------------------------
2005/SEP/17

SQL> SELECT TO_DATE('01/OCT/2005', 'DD/MON/YYYY') FROM DUAL;

TO_DATE('0
----------
2005/10/01
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
と打った後に
SQL> SELECT TO_DATE('01/OCT/2005', 'DD/MON/YYYY') FROM DUAL;
とすればきちんと結果が返ってきました。

どうもありがとうございます。

お礼日時:2005/09/18 09:02

#1です。

お役に立てず申し訳ない。
ウチの環境では問題なく表示されたんですが、#2さんのおっしゃるようなこともあるんですね。
ちなみに、kyujikun さんの環境はどんなだったのでしょうか?参考までに教えていただければ。
    • good
    • 0
この回答へのお礼

#2さんの言うとおりにすればうまくできました。
私の環境はXPproで、OracleのSQL*Plusの10gを使用しています。
ご参考になれば幸いです。

お礼日時:2005/09/18 09:04

#2 です。

確認してみると
SELECT
TO_DATE('01/OCT/2005','DD/MON/YYYY','NLS_DATE_LANGUAGE=AMERICAN') FROM DUAL;
という方法もありました。こちらの方が簡単でしたね。
    • good
    • 1

こんにちは。


書式が違う?
select to_date('1-OCT-2004','DD-MM-YYYY') FROM DUAL;
でいかがでしょうか?

この回答への補足

回答ありがとうございます。
実行すると以下のようなエラーが出現しました。
「数値を指定する箇所に数値でないものが指定されています」
とありますが、OCTがマズイのでしょうか?
参考書などにはこういう記述もありますが。
よろしければ回答のほど宜しくお願い致します。

SQL> select to_date('1-OCT-2004','DD-MM-YYYY') FROM DUAL;
select to_date('1-OCT-2004','DD-MM-YYYY') FROM DUAL
*
行1でエラーが発生しました。:
ORA-01858: 数値を指定する箇所に数値でないものが指定されています

補足日時:2005/09/17 18:03
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QORA-01858: 数値を指定する箇所に数値以外の文字が指定されています

<エラーメッセージの内容>
ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています
開発言語は、java,oracle10g express editionです
スケジュールを登録する画面のところの日付のインサートで失敗します。「→」の部分です。

<以下のSQLをSQL/PLUSで実行するとうまくいきます>
insert into schedule values(1, 1, '予定1', '予定1です', TO_DATE('2009-06-01 10:00','YYYY/MM/DD HH24:MI:SS') , TO_DATE('2009-06-01 12:00','YYYY/MM/DD HH24:MI:SS'), 'A社', '予定1のコメントです。',1);


<問題のソースコード>
* スケジュール情報をデータベースに新規保存する
public void create(Schedule schedule) {
String sql =
"insert into "
+ SCHEDULE_TABLE_NAME
+ " (id, user_id,subject,content, start_time, end_time, place, comment1, is_publish) values(?,?,?,?,?,?,?,?,?)";
Connection con = null;
try {
con = createConnection();
con.setAutoCommit(false);
int id = getNextId(con, SCHEDULE_TABLE_NAME);
PreparedStatement stmt = con.prepareStatement(sql);

→stmt.setString(5,toString(schedule.getStartTime()));
→stmt.setString(6, toString(schedule.getEndTime()));

* 日付を文字列表現(yyyy-MM-dd HH:mm)に変換する
private String toString(java.util.Date date) {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm");
→return "TO_DATE('"+"'"+sd.format(date)+"'"+",'YYYY/MM/DD HH24:MI:SS'"+")";
}
ネット、本などでいろいろ調べましたが、わからなかったので、ヒントになることでもいいので、ご教授よろしくお願いします。

<エラーメッセージの内容>
ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています
開発言語は、java,oracle10g express editionです
スケジュールを登録する画面のところの日付のインサートで失敗します。「→」の部分です。

<以下のSQLをSQL/PLUSで実行するとうまくいきます>
insert into schedule values(1, 1, '予定1', '予定1です', TO_DATE('2009-06-01 10:00','YYYY/MM/DD HH24:MI:SS') , TO_DATE('2009-06-01 12:00','YYYY/MM/DD HH24:MI:SS'), 'A社', '予定1のコメントです。',1);...続きを読む

Aベストアンサー

パラメータをセットされたSQLは以下のようになってしまいます。

insert into schedule values(1, 1, '予定1', '予定1です', 'TO_DATE(''2009-06-01 10:00'',''YYYY/MM/DD HH24:MI:SS'')' , 'TO_DATE(''2009-06-01 12:00'',''YYYY/MM/DD HH24:MI:SS'')', 'A社', '予定1のコメントです。',1);

つまりTO_DATE(・・・)が文字列として扱われてしまいます。
ですのでNo1の方の方法の「PreparedStatement#setTimestamp」を利用するか、
String sql = "insert into " + SCHEDULE_TABLE_NAME + " (id, user_id,subject,content, start_time, end_time, place, comment1, is_publish) values(?,?,?,?,?,TO_DATE(?,'YYYY/MM/DD HH24:MI:SS'),TO_DATE(?,'YYYY/MM/DD HH24:MI:SS'),?,?)";
にして、toString関数でsd.formatの値を返せばいけるような気がします。

パラメータをセットされたSQLは以下のようになってしまいます。

insert into schedule values(1, 1, '予定1', '予定1です', 'TO_DATE(''2009-06-01 10:00'',''YYYY/MM/DD HH24:MI:SS'')' , 'TO_DATE(''2009-06-01 12:00'',''YYYY/MM/DD HH24:MI:SS'')', 'A社', '予定1のコメントです。',1);

つまりTO_DATE(・・・)が文字列として扱われてしまいます。
ですのでNo1の方の方法の「PreparedStatement#setTimestamp」を利用するか、
String sql = "insert into " + SCHEDULE_TABLE_NAME + " (id, user_id,subj...続きを読む

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

使用環境
WINXPPro WIN2003SERVER Oracle10g

データベースに数値型の日付があるのですが、これを日付型にして表示しようとすると「ORA-01843: 指定した月が無効です」となってしまいます。

select
B01 as 番号,B02 as 注文先,
to_DATE(to_char(B10, '000000'),'RRMMDD') as 納期,
B03 as 品名,B04 as 型式,B05 as 数量 FROM TYUMON

結果、数件は表示されます
多分、数値が6桁になっているデータだと思います
940101
990201
です。

検索してみて
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
を実行しても結果は同じでした。

よろしくお願いします

Aベストアンサー

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: 指定した月が無効です。


如何でしょうか。

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'),'RRM...続きを読む

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q日数算出SQL

すみません教えてください。
DB→Oracle9iで「日付A」と「日付B」の間の日数を表示させようとしているのですが、うまくいきません。
参考書などでは、「Months_Between関数」でも試してみたのですが、うまくいきません。単純なやりかたあればおしえていただきたいのですが、よろしくお願いいたします。

Aベストアンサー

こんにちは。

Months_Betweenは、差分を月で表す場合に使います。
この場合は1ヶ月未満は小数になってしまいますね・・・。

日付だけでいいなら単純に引き算します。
SELECT to_date(日付A)-to_date(日付B)
FROM テーブル
です。
(^^ゞ

Q単一グループのグループ関数ではありません。

オラクル10を使っています。

select NAMAE max(TEN) from KYOUKA WHERE OK=1 and CLASS IS ('A', 'B', 'C');

で単一グループのグループ関数ではありません。
というエラーになります。

CLASS | OK | NAMAE | TEN |
--------------------------
A 1 a01 50
A 1 a02 60
B 1 b01 10
C 1 c01 70
C 0 c02 100

a02 60
b01 10
c01 70
という結果になってほしいです。

Aベストアンサー

SQLの根本的な文法が理解できていないのかと

GROUP BY 句について調べてみましょう

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qupdate文で改行を入れる

こんにちは。
いつもお世話になっています。

update文を使用して、データに改行を入れたいのですが、どうすればよいでしょうか。

対象列のデータ型はVARCHAR2です。

例えばSQLPLUSから、
SPL>update 「テーブル名」set 「対象列」='あ改行い改行う改行'
を投入し、そのあと
select 「対象列」 from 「テーブル名」
とすると
SQL>あ
SQL>い
SQL>う
と出てくればよいんですが、
SQL>update 「テーブル名」set 「対象列」='あ\nい\nう\n'
としても
SQL>あ\nい\nう\n
と、「\n」が文字列としてでてきてしまいます。

SPL>update 「テーブル名」set 「対象列」='あ
2い
3う'
と投入すると、期待通りになるのですが、
そうではなく一行にまとめたいのですがどうすれば良いでしょうか。

Oracle9iを使用しています。
宜しくお願いいたします。

Aベストアンサー

こんにちわyukio200263さん
以下のSQL文でどうでしょうか?

UPDATE 「テーブル名」
SET 「対象列」= 'あ' || CHR(13) || CHR(10) ||'い'

ちょっと長くなってしまいますが、一行で可能です。


人気Q&Aランキング

おすすめ情報