列の日付に日付と時刻が含まれていることを知って、テーブルからレコードを取得しようとしています。
それぞれname
とdate
の2つの列のみを含むt1
というテーブルがあるとします。
この8/3/2010 12:34:20 PM
のような列の日付に保存されるデータ。
たとえば、このクエリでこのレコードを取得したい(時間を入れないことに注意してください):
Select * From t1 Where date="8/3/2010"
このクエリでは何も得られません。
時間なしでdate
のみを知ることでdate
を取得するにはどうすればよいですか?
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));
日付列を正しい形式に変換して比較します。
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'になります
個人的に、私は通常次のように行きます:
select *
from t1
where date between trunc( :somedate ) -- 00:00:00
and trunc( :somedate ) + .99999 -- 23:59:59
Between関数を使用して、2010-08-03 00:00:00:000と2010-08-03 23:59:59:000の間のすべてのレコードを取得できます。
trunc(my_date,'DD')
は、Oracleの時刻ではなく、日付のみを提供します。
次の方法を試してください。
Select * from t1 where date(col_name)="8/3/2010"