【问题标题】:sql date between with parameters带参数的sql日期
【发布时间】:2011-09-11 08:12:05
【问题描述】:

我以为很简单的事情变成了一场噩梦。 . . 我试图从中获取数据的表非常简单:

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;

但它不会工作....有什么想法吗?

【问题讨论】:

  • 您的 SQL 显然在逻辑上存在缺陷,因为它归结为“给我所有类型为“a1”且价格介于 True 和 False 之间的记录”。您介意用简单的英语描述您想要实现的目标吗?

标签: sql delphi delphi-xe


【解决方案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;

【讨论】:

  • S_DATE 和 E_DATE 等于的参数呢? BETWEEN 具有包容性。另外,在第一个查询中,您可以简单地使用 BETWEEN 两次,每个参数一次。
  • 'select * from R_PRICES where R_TYPE = :A1 and S_DATE :a2 ';只选择设计的“价格范围”。示例:25/4/2011 和 25/6/2011 之间的 PRICE 区域为 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 PRICE 120 第一个版本的查询:和 S_DATE > :a2 AND E_DATE
  • 我认为这个查询也需要一个 DATEDIFF 参数(AS DAYS),因为我认为如果它们跨越不同的价格范围,我会以重叠的价格运行。这里有类似的东西:stackoverflow.com/questions/5452774/…
  • 我想要达到的结果是:(这是表数据)S_DATE E_DATE PRICE 25/4/2011 25/6/2011 120 25/6/2011 20/8/2011 140 现在,如果我在我的日期时间选择器中选择日期参数,例如:a2 = 24.6.2011:a3 = 28.6.2011 在网格中我得到:S_DATE E_DATE PRICE DAYS 24.6.2011 25/6/201 120 1 25/6/2011 28.6.2011 140 3
  • stackoverflow.com/questions/5452774/… 这或多或少只是我需要的参数。我重组了表格和查询,但无法使其工作 - 上面的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2016-08-22
相关资源
最近更新 更多