2016-01-28 74 views
-1

我需要从我正在开发的可以采用日期范围(例如“01/28/2016-01/30/2016”)的前端应用程序执行查询以及在范围内的日期内搜索7个日期字段pd1到pd7,然后获取字段pa1到pa7的值。因此查询范围内的付款日期并返回匹配日期字段的付款金额。所以如果我做SELECT pd1,pa1,pd2,pa2,....从付款中pd1或pd2 ... is ='daterange'< - 这是我迷路的地方有一个更简单的方法来做我的正在努力去做。我将获得日期范围内的所有付款,并将它们总计为预计付款的总计。查询日期和匹配字段值的返回值

+0

请给出一个更好的解释你的问题到底在哪里?你遇到了什么错误? –

回答

0

该规范有点模棱两可。假设pd1,pd2 ...,pd7是数据类型为DATE的列,并且假定列pa1,pa2,... 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值相对应。

有几种方法。

如果您只是询问如何确定要返回哪些行,只需将该“日期范围”拆分为两个字段,然后将每个格式重新格式化为yyyy-mm-dd格式。 (我还会假设第一个“日期”的值等于第二个“日期”的值)。

如果您只是想返回两个值之间的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 ? 

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

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关键字提供。关于AND关键字后,将为?占位符提供更晚的日期。

再次,这些值将需要以MySQL标准DATE格式提供给查询:YYYY-MM-DD。例如2016-01-282016-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) 

如果没有定义适当的索引,然后在单次通过该表将可能会更快。

SELECT SUM(IF(t.pd1 BETWEEN ? AND ?, t.pa1, 0) 
      + IF(t.pd2 BETWEEN ? AND ?, t.pa2, 0) 
      + IF(t.pd3 BETWEEN ? AND ?, t.pa3, 0) 
      + IF(t.pd4 BETWEEN ? AND ?, t.pa4, 0) 
      + IF(t.pd5 BETWEEN ? AND ?, t.pa5, 0) 
      + IF(t.pd6 BETWEEN ? AND ?, t.pa6, 0) 
      + IF(t.pd7 BETWEEN ? AND ?, t.pa7, 0) 
     ) AS `total` 
    FROM mytable t