查询日期并返回匹配字段值的值

时间:2016-01-28 16:31:35

标签: mysql

我需要从我正在开发的前端应用程序进行查询,该应用程序可以采用日期范围,例如“01/28 / 2016-01 / 30/2016”,并搜索7个日期字段pd1至pd7在该范围内的日期,然后获得字段pa1到pa7的值。这样就可以查询范围内的支付日期,并返回匹配的日期字段的支付金额。所以如果我做SELECT pd1,pa1,pd2,pa2,.... FROM PAYMENTS WHERE pd1或pd2 ... is ='daterange'< - 这就是我迷路的地方有一个更容易的方法来做什么我正在努力做到。我将获得日期范围内的所有付款,并将它们与预期付款的总计算结算起来。

1 个答案:

答案 0 :(得分:0)

规范有点含糊不清。假设pd1pd2 ...,pd7是数据类型DATE的列,并假定列pa1pa2,... { {1}}是数值数据类型。我也会假设你的前端应用程序"支持带有绑定占位符的预处理语句。 (鉴于问题中的信息稀少,这可能太过于假设。)

让我们使用一个简化的例子。鉴于此表中的数据:

pa7

对于"日期范围"您期望返回的确切结果是什么?是pd1 pa1 pd2 pa2 ---------- ---- ---------- ---- 2016-01-29 100 2015-12-12 49 2015-11-11 24 2016-01-30 10

01/28/2016-01/30/2016

total
-----
  110

规范有点含糊不清。我将假设您需要前一个结果,只需要total ----- 183 列的值与指定日期范围内的paN值对应的总和。

有几种方法。

如果您只是询问如何识别要返回的行,只需将其分成"日期范围"分为两个字段,并将每个字段重新格式化为pdN格式。 (我也会假设第一个" date"的值在第二个" date"之前或之前等。)

如果您只想在两个日期之间返回yyyy-mm-dd值的行:

pdN

如果您正在寻找"总计",如果没有要检查的七列,这将更加简单。如果数据被标准化,则每个paN和相应的pdN在单独的行上。但是处理现有数据的不幸结构,我们可以这样:

SELECT ...
  FROM mytable t
 WHERE t.pd1 BETWEEN ? AND ?
    OR t.pd2 BETWEEN ? AND ?
    OR t.pd3 BETWEEN ? AND ?
    OR t.pd4 BETWEEN ? AND ?
    OR t.pd6 BETWEEN ? AND ?
    OR t.pd7 BETWEEN ? AND ?

为每个查询中的SELECT SUM(q.tot) AS `total` FROM ( SELECT SUM(t1.pa1) AS tot FROM mytable t1 WHERE t1.pd1 BETWEEN ? AND ? UNION ALL SELECT SUM(t2.pa2) AS tot FROM mytable t2 WHERE t2.pd2 BETWEEN ? AND ? UNION ALL SELECT SUM(t3.pa3) AS tot FROM mytable t3 WHERE t3.pd3 BETWEEN ? AND ? UNION ALL SELECT SUM(t4.pa4) AS tot FROM mytable t4 WHERE t4.pd4 BETWEEN ? AND ? UNION ALL SELECT SUM(t5.pa5) AS tot FROM mytable t5 WHERE t5.pd5 BETWEEN ? AND ? UNION ALL SELECT SUM(t6.pa6) AS tot FROM mytable t6 WHERE t6.pd6 BETWEEN ? AND ? UNION ALL SELECT SUM(t7.pa7) AS tot FROM mytable t7 WHERE t7.pd7 BETWEEN ? AND ? ) q 关键字后的?占位符提供了较早的日期值。并且BETWEEN关键字后面的?占位符会提供更晚的日期。

同样,这些值需要以MySQL标准DATE格式提供给查询:AND。例如YYYY-MM-DD2016-01-28

为了获得此查询的最佳性能,您将需要定义索引

2016-01-30

如果没有定义合适的索引,那么单次通过表可能会更快。

... ON mytable (pd1, pa1)
... ON mytable (pd2, pa2)
... ON mytable (pd3, pa3)
... ON mytable (pd4, pa4)
... ON mytable (pd5, pa5)
... ON mytable (pd6, pa6)
... ON mytable (pd7, pa7)