2011-06-09 56 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