• ベストアンサー

date型のインデックス

インデックスが貼ってあるdate型のカラムがあるのですが、うまくインデックスがあたりません。 検索条件を下記のようにしています。 working_date = TO_DATE('2010/11/26') date型は秒数を保持していることが影響しているのでしょうか? ファンクションインデックスを貼って、下記のようにすればインデックスは当たってます。  TO_DATE(working_date,'YYYY/MM/DD') = '2010/11/26' ご存知のかたがおられましたら教えてください。

  • Oracle
  • 回答数6
  • ありがとう数7

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

  • ベストアンサー
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.2

実際に working_date に格納されている値に時刻が含まれているのですか? > TO_DATE(working_date,'YYYY/MM/DD') = '2010/11/26' これは、文字列である working_date を date型に変換して、文字列と比較という奇妙なことになります。 本当に working_date が date型で、ファンクションインデックスを張るなら、 TRUNC(working_date) がよろしいかと。

cosboki
質問者

お礼

ご回答ありがとうございます。 >実際に working_date に格納されている値に時刻が含まれているのですか? 下記のような値がはいってます。 2010/11/26 14:58:35 やはり秒数が問題なのでしょうか?

その他の回答 (5)

  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.6

質問者さんはファンクションインデックスの意味を理解してないのでは... http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34986&forum=8 http://www.atmarkit.co.jp/fdb/rensai/oraobstacle03/oraobstacle03_1.html

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.5

もし、ご質問が単に「Where条件が思い通りにならない」であれば where to_char(working_date, 'yyyy/mm/dd') = '2010/11/26' で良いのでは? 何百万レコードもあるようならファンクションインデックスを検討してみては?

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.4

working_date between TO_DATE('2010/11/26 00:00:00','YYYY/MM/DD HH24:Mi:SS') AND TO_DATE('2010/11/26 23:59:59','YYYY/MM/DD HH24:Mi:SS') としてみては

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.3

・「実行計画を表示すると、TABLE ACCESS FULLとなっている」 ということなのでしょうか? ・warking_dateへのインデックスは単独列へのインデックスですか? 上記がYESであれば、実行計画はINDEX RANGE SCANになってしかるべきだと思います。 時分秒は0:0:0を指定しているのと同じなので、指定が必要とは思われませんが、 いちおう以下も試してみますか。 working_date = TO_DATE('2010/11/26 00:00:00', 'YYYY/MM/DD HH24:MI:SS')

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

working_date = TO_DATE('2010/11/26','YYYY/MM/DD') としたらどうでしょう。 時分秒があるので、DB中の項目は時分秒はどのような値になっているのでしょうか?

cosboki
質問者

お礼

ご回答ありがとうございます。 >DB中の項目は時分秒はどのような値になっているのでしょうか? 下記のような値がはいっております。 2010/11/26 14:58:35 やはり秒数まで正確に当てにいかないとインデックスは効かないものでしょうか?

関連するQ&A

  • 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')

  • date型へのinsertについて

    cプログラムにてoracleのあるテーブルのdate型カラムに値をinsertしたいのですが、 'YYYY/MM/DD hh:mm:ss'の情報を格納するにはどうすればよいのでしょうか? TO_DATEを使用するのでしょうか?

  • date型

    date型のカラムに1:00という時間を入れたいけどうまくいきません。yyyy/mm/dd hh:mmという形になります。PHPで取り出すときにSUBSTR関数を使って取り出そうとしても取り出せません。無理なのでしょうか??

  • 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 逆の気がするのですが、なぜでしょうか。

  • データベースのDate型カラムの扱いについて

    カラム(Date型)に入っている日付を取得し、 「yyyy/mm/dd」「yy/mm/dd」の形式で JSPで表示したいのですが、どうすればいいのでしょうか? Date型はrs.getStringでは取得出来ないのでしょうか・・ 上記の実現の仕方を教えて下さい。 データベースはPostgreSQLです。

    • ベストアンサー
    • Java
  • Excelマクロで不要な行を繰り返し処理で削除する

    下記の図表【事前】のA列に時間(シリアル値)が入力されていますが、 これをマクロを使って不要な時間帯のデータを行ごと削除したいです。 それを実行するためのマクロをご教示頂けますでしょうか? 削除対象の条件 ・9:00:00~18:00:00以外の夜間や早朝の時間帯は削除する。 その他 ・データが入力されている行数分繰り返し処理 ・秒数、分数は全て0 ・列は3列(B、C列は任意) ・Excelのバージョンは2007 【事前】   A                        B      C 1 yyyy/mm/dd 01:00:00 ※削除対象 2 yyyy/mm/dd 23:00:00 ※削除対象 3 yyyy/mm/dd 09:00:00 4 yyyy/mm/dd 15:00:00 5 yyyy/mm/dd 17:00:00 6 yyyy/mm/dd 19:00:00 ※削除対象 7 yyyy/mm/dd 04:00:00 ※削除対象 【事後】   A                        B      C 1 yyyy/mm/dd 09:00:00 2 yyyy/mm/dd 15:00:00 3 yyyy/mm/dd 17:00:00

  • Oracleで、DATE型カラムについて

    Oracle9iで、テーブルを作成しました。 各テーブルには、DATE型のカラムがあります。 テーブル内:2004-04-17 01:15:00 と、入っているとき SELECT TO_CHAR(日付,'yyyy/mm/dd hh24:mi') FROM テーブル という風にアクセスしました。 しかし、 あるテーブルでは、 4/04/17 省略形になったり、 はたまた、あるテーブルでは、 2004/04/17 00:00 と時分が0になってしまったり。 なぜ、上のように、フォーマットを指定しているのにもかかわらず、おかしくなってしまうのかわかりません。 わかる方、お教えください。

  • 【PL/SQL】DATE型の時刻の表示と非表示

    PL/SQLでのDATE型の取扱いについて教えてください。 初期化パラメータNLS_DATE_FORMATが'YY-MM-DD'で、 ある列を'YYYY/MM/DD HH24:MI:SS'形式でDBにINSERTしたい場合、 dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); としてINSERTにdtWorkEndDateを用いると、 YY-MM-DD形式でDBに登録されてしまいます。 (dtWorkEndDateはDATE型。) ORACLEの設定かPL/SQLの問題なのかわからないのですが、 なにかアドバイスを頂けないでしょうか。 よろしくお願いします。

  • PL/SQLでのTO_DATEの時間取得について

    お世話になります。 PL/SQLでDATE型のデータの日時を取得する方法を教えてください。 PL/SQLでDBの値を、TO_CHARで取ってきて、その値をTO_DATEすると、時刻が落ちてしまいます。 charWorkEndDate VARCHAR2(20); dtWorkEndDate DATE; charWorkEndDate := to_char(V00061_Rec.S_DATE5, 'YYYY/MM/DD HH24:MI:SS'); dtWorkEndDate := to_date(charWorkEndDate, 'YYYY/MM/DD HH24:MI:SS'); 出力結果 --charWorkEndDate- [2005/12/25 06:00:19] --dtWorkEndDate- [05-12-25] to_dateの1つ目の引数にシングルクォーテーションが必要かと思い、 dtWorkEndDate := to_date('''||charWorkEndDate||''', 'YYYY/MM/DD HH24:MI:SS'); としてみたのですが、その場合、「ORA-01841: (周)年は-4713と+9999の間の0以外の数を指定する必要があります」とのエラーが出てしまいます。 どなたかDATE型のデータの時刻を取る方法をご存知でしたら、教えていただけますでしょうか。 よろしくお願いします。

  • 日時の期間での抽出

    スケジュール帳のWebアプリを作成していて PostgreSQLを使用しています。 sc_tblというテーブルのday_timeというカラムに日時 to_doというカラムに予定を入れているのですが 日時2006/12/01 01:00のデータを期間の抽出条件で抽出する時 2006/11/30 20:00~2006/11/30 26:00という条件で抽出できるような SQL文はあるのでしょうか。(1:00を25:00として抽出したい) 下記2つのSQLでは無理でした。 ・その1 select day_time, to_do from sc_tbl where day_time >= cast('2006-11-30 20:00:00' as timestamp) and day_time <= cast('2006-11-30 26:00:00' as timestamp); ・その2 select day_time, to_do from sc_tbl where day_time >= to_date('2006-11-30 20:00:00','YYYY-MM-DD H24:MI:SS') and day_time <= to_date('2006-11-30 26:00:00','YYYY-MM-DD H24:MI:SS');