TO_DATEの使い方を教えてください

このQ&Aのポイント
  • Oracleを習い始めたばかりで、TO_DATE関数を使用して特定の条件でレコードを抽出しようとしていますが、うまくいきません。
  • その条件に合うレコードは存在していることが確かで、日付をデフォルトの形式で書くとSELECTできることを確認しました。
  • TO_DATE関数の使用方法に誤りがある可能性があります。どのように修正すれば正しく抽出できるのでしょうか。お手数ですが、教えていただけますか?
回答を見る
  • ベストアンサー

TO_DATEの使い方を教えて下さい

Oracleを習い始めたばかりで、とても初歩的な質問ですみません。 customer_numberが124でorder_dateが09/05/98のレコードをSELECTしたいのですが、 TO_DATEを使うとうまくいきません。 その条件に合うレコードは存在して、日付をデフォルトの形で書くとSELECTできます。 TO_DATEの使い方を間違えているのでしょうか。 よろしくお願いします。 SQL> select order_number 2 from orders 3 where customer_number='124' and order_date='05-SEP-98'; ORDER ----- 12500 SQL> select order_number 2 from orders 3 where customer_number='124' and order_date=to_date('09/05/98','MM/DD/YY'); no rows selected

  • Oracle
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.1

実際のデータ内容は1998年じゃないでしょうか? YYを指定すると2098年を意味するはずです。 to_date('09/05/98','MM/DD/RR')

参考URL:
http://otndnld.oracle.co.jp/document/products/oracle10g/101/doc_v5/server.101/B12454-01.pdf
momo256
質問者

お礼

早速のお返事ありがとうございます。 to_date('09/05/98','MM/DD/RR') で試してみたところ、うまくいきました。 ありがとうございました。

関連するQ&A

  • date型でのbetweenについて教えてください。

    皆様、新年明けましておめでとうございます。 早速ですが、date型でのbetweenについて教えてください。 SQL文 SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' を発行すると、2007-12-31のレコードがあるのに該当しません・・・ 試しにSQL文を SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59' としても2007-12-31のレコードは検索されません・・・ SQL文を SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01' にすると2007-12-31が該当するのですが、 SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' では2007-12-31のレコードは該当しないものでしょうか?? select * from test where num between 10 and 100 とした場合では、num が 10 ~ 100 のものが問い合わされますよね?? date型になるとこうならないのでしょうか?? よろしくお願いします。

  • SQLコマンドの「TO_DATE」について

    SQLコマンドで、下記を実行すると「2014/04/03」などが取得できると思ったのですが、 「14/04/03」で取得してしまいます。 (aaa_dateは、DATE型で、「2014/04/03」などが入ってます) select TO_DATE(aaa_date,'YYYY/MM/DD') from AAA_TBL YYYYをYYにして、下記を実行すると、なぜか、「2014/04/03」と正常に取得します。 select TO_DATE(aaa_date,'YY/MM/DD') from AAA_TBL 逆の気がするのですが、なぜでしょうか。

  • TO_DATE関数について

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

  • DATE型カラムのインデックスが効かない

    Oracle初心者です。 以下のような2種類のSQLをSQLPLUSで実行し、 実行計画を取得しました。 end_timeでfilterをかける際に、"TABLE ACCESS FULL"となっており、貼っているインデックスが使われていないことがわかりました。 #これがSQLの遅い主要因と考えています。。。。勘です。 インデックスが活用されていない原因としてはどのようなものが考えられるのでしょうか。 宜しくお願いいたします。 1) set autotrace traceonly select * from t_sample where end_time >= '2009-08-25' and end_time <= '2009-11-26' 2) set autotrace traceonly select * from t_sample where end_time >= to_date('2009-08-25', 'yyyy-mm-dd') and end_time <= to_date('2009-11-26', 'yyyy-mm-dd')

  • ROWNUMでUPDATEをしたいのですが・・・。

    SQL初心者です。 以下のようなテーブルがあり、 ESTAB/PATTERN/NUMBER/CD 1/00/ 1/01 1/00/ 3/02 1/00/ 4/04 1/00/ 5/05 7/00/ 1/01 7/00/ 2/03 7/00/ 3/04 7/00/ 4/05 (主キー=ESTAB、PATTERN、NUMBER) SELECT ROWNUM,ESTAB,PATTERN,NUMBER,CD FROM (SELECT ESTAB,PATTERN,NUMBER,CD FROM M_PATTERN WHERE PATTERN='00' AND ESTAB='1' ORDER BY NUMBER) WHERE PATTERN='00' AND ESTAB='1' で検索したところの、ROWNUMでNUMBERを更新したいのですが、 UPDATE M_PATTERN A SET A.NUMBER= (SELECT ROWNUM FROM (SELECT ESTAB,PATTERN,NUMBER FROM M_PATTERN WHERE PATURN='00' AND ESTAB='1' ORDER BY NUMBER) B WHERE A.NUMBER=B.NUMBER AND A.PATTERN=B.PATTERN AND A.ESTAB=B.ESTAB AND B.PATTERN='00' AND B.ESTAB='1') WHERE A.PATTERN='00' AND A.ESTAB='1' としてみたところ、一意制約違反が発生してしまいます。 それとも、このようなUPDATEは無理なんでしょうか?

  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

  • 文字のゼロ埋め

    初歩的なことかもしれませんがよろしくお願いします。 ----- 時間DB ---------------- 年月日 NUMBER(8,0) 時 NUMBER(2,0) ---------------------------- 次ののSQLを発行すると SELECT * FROM 時間DB WHERE (年月日 || 時) >= 2006030101 AND (年月日 || 時) <= 2006030223 時がNUMBER型なので 2006030110以上のレコードがSELECTされてきてしまいます。 時をゼロ埋めにしてから上記のSQLを発行するには どのようにしたらよいのでしょうか? また,その他に良い方法がございましたら 御教授願います。

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。

  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

  • 一部データを除外するSQL

    SQL(MySQL)についての質問です。 顧客データの中からある月の誕生日のデータを抽出しようと考えています。 6月生まれだったら、 SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 6; 12月生まれだったら SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 12; でできるんですが、実は顧客データの中には誕生日がわからない人がいて、 その場合「1900-01-01」をセットしています。 ですので、1月生まれを指定する SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 1; とすると誕生日が「1900-01-01」の人も含まれてしまいます。 誕生日「1900-01-01」のデータを排除するSQLがわからなくて困っています。 NOT IN とか EXCEPT とか使ってみたんですがうまくいきませんでした。 どなたか教えて頂けると大変うれしいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL