2011-06-09 15 views
0

私は単純だと思ったのは悪夢であることが判明しました。 。 。 私はからデータを取得しようとしていますテーブルは非常に単純です:パラメータとの間のSQLの日付

R_TYPE (string) 
R_PRICE (currency) 
S_DATE (date) 
E_DATE (date) 

は、私が実行します。

SELECT * 
    FROM MYTABLE 
WHERE R_TYPE = :a1 
    AND R_PRICE BETWEEN S_DATE = :a2 
        AND E_DATE = :a3 

パラメータは以下のとおりです。

ABSQuery1.params.ParamByName('a1').asString :=cxTextEdit; 
ABSQuery1.params.ParamByName('a2').asDate := DateTimePicker1; 
ABSQuery1.params.ParamByName('a3').asDate := DateTimePicker2; 

しかし、それは文句を言わない仕事します... 。 何か案は?

+1

あなたのSQLは、論理的に明らかであるフロリダ州それは「真実と偽の間の価格を持つタイプのレコードをすべて私に渡す」ということになるからです。あなたは何を達成したいのですか? –

答えて

1

あなたのクエリは混乱しています:価格は、日付比較の真偽結果の間にあることはできません。日付ピッカーはその全期間を持っていた任意の価格を選んでいる場合

は日付が選んだの間、これを使用する(すなわち、それは開始と終了):

select * from MYTABLE where R_TYPE = :a1 and S_DATE > :a2 AND E_DATE < :a3; 

日付ピッカーは、任意の価格を選んでいる場合は、その日付の間が選んだいくつかの時間を持っていた(つまり、日付範囲拾い、そして価格の日付範囲の少なくともいくつかの重複があった)、これを使用する:

select * from MYTABLE where R_TYPE = :a1 and S_DATE < :a3 AND E_DATE > :a2; 
+0

S_DATEとE_DATE **は**パラメーターと同じですか? 'BETWEEN'は包括的に働きます。さらに、最初のクエリでは、単純に 'BETWEEN'を各パラメータに対して2回使用することができます。 –

+0

'select * from R_PRICESここで、R_TYPE =:A1およびS_DATE <:a3 AND E_DATE>:a2'; は、設計された「価格帯」のみを選択しています。 例: 価格25/4/2011から25/6/2011までは120ユーロです。今 私はパラメータで引用されqueeryを打つ:A2 = 2011年10月6日と :A3 = 2011年6月11日 私は、グリッド内のget: S_DATE = 25/4/2011年 E_DATE = 25/6/2011 > とS_DATE::私は「選択」日付が を表示してqueeryの適切な価格すなわちS_DATE = 2011年10月6日E_DATE = 2011年6月11日PRICE 120 最初のバージョンたくwant.Iものではありません A2およびE_DATE <:a3 同じパラメータで実行しても何も表示されません(?)。 – user763539

+0

私は 異なる価格帯にまたがる場合、私は重複した価格で実行すると思うので、このクエリはDATEDIFFパラメータ(AS DAYS)を必要とすると思います。ここでは同様の 何か: http://stackoverflow.com/questions/5452774/hotel-booking-rates-sql-problem – user763539

関連する問題