2011-06-09 51 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顯然是邏輯FL敬畏,因爲它歸結爲「給我所有類型爲」a1「的記錄,其價格介於True和False之間。你會介意用簡單的英文描述你想達到的目標嗎? – 2011-06-09 07:08:18

回答

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」,每次使用一次。 – 2011-06-09 05:52:19

+0

'select * from R_PRICES where R_TYPE =:A1 and S_DATE <:a3 AND E_DATE>:a2'; 僅選擇設計的「價格範圍」。 例如: 2011年25/4和2011年5月25日之間的價格區域爲120歐元。 現在,當我用參數打開引用的排隊::a2 = 10/6/2011和 :a3 = 11.6.2011 我在網格中獲得: S_DATE = 25/4/2011 E_DATE = 25/6/2011 這不是我想要的。我想要「選擇」日期顯示 和正確的價格即S_DATE = 10/6/2011 E_DATE = 11.6.2011價格120 第一版的排隊日期: 和S_DATE>:a2 AND E_DATE <:a3 以相同參數運行時不顯示任何內容(?)。 – user763539 2011-06-10 17:32:12

+0

我想這個查詢也需要一個DATEDIFF參數(AS DAYS),因爲我認爲如果它們跨越不同的價格範圍,我將以重疊價格運行。 東西在這裏類似: http://stackoverflow.com/questions/5452774/hotel-booking-rates-sql-problem – user763539 2011-06-10 17:32:52