簡體   English   中英

MySQL計數包括不在日期范圍內的月份

[英]MySQL Count that includes months not within the date range

假設我有一個包含以下表的表:

+----+-----------+---------+-------------------------+
| id |  item     |  ....   | dateLogged              |
+----+-----------+---------+-------------------------+
|  1 | 2015-001  |  ....   | 2015-06-01 12:09:00     |
|  2 | 2015-001  |  ....   | 2015-06-01 12:09:00     |
|  3 | 2015-002  |  ....   | 2015-06-30 15:40:02     |
|  4 | 2015-002  |  ....   | 2015-06-30 15:40:03     |
|  5 | 2015-003  |  ....   | 2015-07-02 13:38:22     |
+----+-----------+---------+-------------------------+

我想根據年份,月份從dateLogged中搜索項目數,並使用預期數據:

+--------+----------+----------------+
| year   |  month   |     total      | 
+--------+----------+----------------+
|  2015  | January  |      0         | 
|  2015  | February |      0         | 
|  2015  | March    |      0         | 
|  2015  | April    |      0         | 
|  2015  | May      |      0         | 
|  2015  | June     |      4         | 
|  2015  | July     |      1         | 
|  2015  | August   |      0         | 
|  2015  | September|      0         | 
|  2015  | October  |      0         | 
|  2015  | November |      0         | 
|  2015  | December |      0         |
+--------+----------+----------------+

但是我只能基於以下SQL來獲取它:

SELECT DATE_FORMAT(dateLogged, '%Y') as 'year', MONTHNAME(dateLogged) 
as 'month', COUNT(id) as 'total' from item a where dateLogged >= '2015-06-29 00:00:00' 
and dateLogged <= '2015-07-02 23:59:59' 
GROUP BY DATE_FORMAT(a.dateLogged, '%Y%m');

+--------+---------+----------------+
| year   |  month  |  No of items   | 
+--------+---------+----------------+
|  2015  | June    |      4         | 
|  2015  | July    |      1         | 
+----+-------------+----------------+    

我曾嘗試從stackoverflow的其他位置進行搜索,但無法獲得任何答案,或者可能錯過了。 想知道是否有任何解決方案,謝謝。

我正在使用Java進行計算,因此也歡迎使用Java進行上述計算的任何建議。

您也可以使用循環迭代數月和數年然后查找計數,來更改查詢以返回0值。 像這樣:

Map<String, Integer> values = new HashMap<String, Integer>();
for(int year = 2015; year < 2017; year++)
{
    for(int month = 1; month <= 12; month++)
    {
        rs = stmt.executeQuery("SELECT COUNT(id) as 'total' from item where
                 MONTH(dateLogged) = " + month + " and YEAR(dateLogged) = " + year + ";";
        rs.next();
        int count = rs.getInt("total");
        String time = Integer.toString(year) + "-" + Integer.toString(month);
        values.Add(time, count);
    }
}

這將為您返回如下地圖:

values['2015-1'] = 0;
values['2015-2'] = 0; 

.. 等等。

當然,您可以根據需要將返回的計數與年和月一起存儲,具體取決於您希望如何進一步使用它。

一個想法是以某種方式創建日歷表並使用它,以便您在2015年的每個月都有一行:

SELECT DATE_FORMAT(m, '%Y') as 'year', 
       MONTHNAME(m) as 'month',
       COUNT(id) as 'total' 
FROM (SELECT '2015-01-01' AS m UNION ALL SELECT '2015-02-01' UNION ALL
      SELECT '2015-03-01' UNION ALL SELECT '2015-04-01' UNION ALL 
      SELECT '2015-05-01' UNION ALL SELECT '2015-06-01' UNION ALL 
      SELECT '2015-07-01' UNION ALL SELECT '2015-01-08' UNION ALL 
      SELECT '2015-09-01' UNION ALL SELECT '2015-10-01' UNION ALL 
      SELECT '2015-11-01' UNION ALL SELECT '2015-12-01') AS x
LEFT JOIN item a 
ON DATE_FORMAT(a.dateLogged, '%Y%m') = DATE_FORMAT(x.m, '%Y%m') 
   AND dateLogged >= '2015-06-29 00:00:00' 
   AND dateLogged <= '2015-07-02 23:59:59' 
GROUP BY DATE_FORMAT(x.m, '%Y%m');

上面的查詢利用排序此表用作一個基礎,2015年的在線日歷表的FROM子句,因此該查詢返回每個 2015年的幾個月內排。

在這里演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM