web-dev-qa-db-ja.com

時間のない日付のみを知ってテーブルから選択する(Oracle)

列の日付に日付と時刻が含まれていることを知って、テーブルからレコードを取得しようとしています。

それぞれnamedateの2つの列のみを含むt1というテーブルがあるとします。

この8/3/2010 12:34:20 PMのような列の日付に保存されるデータ。

たとえば、このクエリでこのレコードを取得したい(時間を入れないことに注意してください):

Select * From t1 Where date="8/3/2010"

このクエリでは何も得られません。

時間なしでdateのみを知ることでdateを取得するにはどうすればよいですか?

45
Abdulrhman

DATEはOracleの予約キーワードであるため、代わりにcolumn-name your_dateを使用しています。

your_dateにインデックスがある場合は、

WHERE your_date >= TO_DATE('2010-08-03', 'YYYY-MM-DD')
  AND your_date <  TO_DATE('2010-08-04', 'YYYY-MM-DD')

またはBETWEEN

WHERE your_date BETWEEN TO_DATE('2010-08-03', 'YYYY-MM-DD')
                    AND TO_DATE('2010-08-03 23:59:59', 'YYYY-MM-DD HH24:MI:SS')

インデックスがない場合、またはレコードが多すぎる場合

WHERE TRUNC(your_date) = TO_DATE('2010-08-03', 'YYYY-MM-DD')

十分なはずです。 TRUNC パラメータなしでは、DATEから時間、分、秒が削除されます。


パフォーマンスが本当に重要な場合は、その列に Function Based Index を配置することを検討してください。

CREATE INDEX trunc_date_idx ON t1(TRUNC(your_date));
87
Peter Lang

日付列を正しい形式に変換して比較します。

SELECT * From my_table WHERE to_char(my_table.my_date_col,'MM/dd/yyyy') = '8/3/2010'

この部分

to_char(my_table.my_date_col,'MM/dd/yyyy')

文字列'8/3/2010'になります

3
user648026

個人的に、私は通常次のように行きます:

select * 
from   t1
where  date between trunc( :somedate )          -- 00:00:00
            and     trunc( :somedate ) + .99999 -- 23:59:59
3
R. Genaro

Between関数を使用して、2010-08-03 00:00:00:000と2010-08-03 23:59:59:000の間のすべてのレコードを取得できます。

2
Dustin Laine

trunc(my_date,'DD')は、Oracleの時刻ではなく、日付のみを提供します。

1
Dave Kuziara

次の方法を試してください。

Select * from t1 where date(col_name)="8/3/2010" 
0
kiruthika