我需要從我正在開發的可以採用日期範圍(例如「01/28/2016-01/30/2016」)的前端應用程序執行查詢以及在範圍內的日期內搜索7個日期字段pd1到pd7,然後獲取字段pa1到pa7的值。因此查詢範圍內的付款日期並返回匹配日期字段的付款金額。所以如果我做SELECT pd1,pa1,pd2,pa2,....從付款中pd1或pd2 ... is ='daterange'< - 這是我迷路的地方有一個更簡單的方法來做我的正在努力去做。我將獲得日期範圍內的所有付款,並將它們總計爲預計付款的總計。查詢日期和匹配字段值的返回值
-1
A
回答
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-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)
如果沒有定義適當的索引,然後在單次通過該表將可能會更快。
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
相關問題
- 1. 僅返回匹配的多值字段
- 2. 匹配和返回值
- 3. 如何日期值分配給所有返回的MySQL查詢
- 4. 如何格式化jQuery日期選擇器的返回日期輸入值以匹配mysql日期字段?
- 5. 如何匹配文本和日期以返回值?
- 6. 更新NULL日期字段匹配另一個日期字段值
- 7. Solr多值日期字段,範圍查詢匹配「任何」/「計數」?
- 8. 如何查詢發現的最大值和返回日期
- 9. SQL查詢返回每個ID最接近的日期匹配
- 10. ets:匹配不返回預期值
- 11. PHP中的日期匹配和插值
- 12. 查詢日期和返回雙週溫度平均值
- 13. PHP的MySQL的匹配和返回值
- 14. 「已解決」使用ODBC查詢Excel日期字段返回空值
- 15. 檢查2個字段的匹配值
- 16. 有效返回Lucene中所有查詢匹配的字段
- 17. Solr的查詢不返回預期值
- 18. 使用日期字段來匹配SQL查詢
- 19. 基於2個匹配的字段返回是或否的值
- 20. 回顧API:查詢空日期字段
- 21. 最匹配的字段值
- 22. Linq查詢返回日期字符串?
- 23. XSL返回值不匹配
- 24. InArray返回-1,匹配值
- 25. 模式匹配「返回」值
- 26. 匹配行值返回DF2
- 27. SQL查詢返回基於列匹配的單個值
- 28. SQL查詢返回所有匹配的值
- 29. 在正則表達式查詢返回的特定值匹配
- 30. Linq查詢並返回短日期格式的DateTime字段
請給出一個更好的解釋你的問題到底在哪裏?你遇到了什麼錯誤? –