2016-01-28 109 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