2012-01-14 7 views
1

すべての予約を記録したテーブルがあります。ここで開始日と終了日は、この表に次の形式で格納されます。指定された月の日付を含むすべての行を選択します。

開始日:DD/MM/YYYY 20/01/2011 for 20th

予約終了日と同じフォーマットです。 ここでは、nov、oct、janなどの月単位のカレンダーを特定の曜日の日付なしで提供する必要があります。選択されている場合は、今月のすべての保存日をデータベースに照会し、リストに表示します。

私は現在、javaというようにpreparedStatemetnとStatementを使用しています。どのようにこれを行うことができますか?私が直面している最大の課題は、ユーザーの入力から現在の形式で日付を突き合わせて選択することです。 P.私はOracle SQLを使用しています ありがとうと本当に感謝します。

答えて

3

カラムのタイプがDATEの場合、フォーマットはありません。あなたは2011年10月のすべての日付を望んでいた場合

select to_date(start_date,'dd/mm/yyyy') from mytable; 

はあなたが使用できます:

select * from mytable where trunc(start_date,'MM') = to_date('01/Oct/2011','dd/mm/yyyy'); 

(仮定start_dateのタイプであることがVARCHAR2である場合は、しかし、あなたは日付にキャストすることができるはずですDATE)。私は、日付列に範囲条件を使用することになり

+0

このソリューションは、 'start_date 'のインデックスがオプティマイザで使用されないようにします。 –

+0

フィールドに関数ベースのインデックスを簡単に追加することができます: 'create index trunc_start_date on mytable(trunc(start_date、 'MM'));' –

1

select * from mytable where start_date >= to_date('01/Oct/2011','dd/mm/yyyy') and start_date < to_date('01/Nov/2011','dd/mm/yyyy') 

TRUNCを使用して、オラクルプランナーあなたは非変更された値の範囲を指定ただし、ここで、インデックスを選択することができるはずです。

私は、あなたのテーブルにDATEという形式のJohn Doyleと仮定しています。 VARCHAR2を使用している場合、フル・テーブル・スキャンが必要なため、パフォーマンス上の問題が顕著になります。少なくとも日付形式がyyyy/mm/ddの場合、indexを使用することも可能です。パフォーマンスの問題を避けるためにデータベース設計を変更することを検討してください。

関連する問題