如何使用MYSQL在每个月获得持续的项目计数?

时间:2017-06-07 06:52:34

标签: mysql

我有这样的表

$this->Session->read('auth_user.User.user_name')

我需要每月持续的项目计数。

Title    | start_date |end_date   | 
------   | ---------- |---------  |
Test_pro1 | 2017-06-06 |2017-08-06 |
Test_pro2 | 2017-07-06 |2017-11-06 |

如何在MYSQL中编写查询?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

SELECT MONTH(start_date),count(title)
from projects
group by month(start_date)

答案 1 :(得分:0)

可能你正在寻找这样的东西(用你要检查的值改变YOUR_DATE)?

SELECT  COUNT(*) AS RC
FROM  YOUR_TABLE
WHERE   START_DATE <= YOUR_DATE AND END_DATE >= YOUR_DATE

答案 2 :(得分:0)

我认为概念上最简单的方法是使用日历表(即只包含日期的表,代表每个月),并将其加入当前表。连接条件是给定的年/月落在当前项目的范围内。然后,我们可以按年/月(即日期)对结果集进行分组,并计算每月有多少项目。

请注意,在下面的查询中,我列出了一个临时日历表,其中仅包含2017年的年份和月份。理想情况下,您的架构中会有一个真正的日历表,但是包含所有项目所需的时间范围很广。

SELECT
    t1.year,
    t1.month,
    COUNT(t2.start_date) AS project_count
FROM
(
    SELECT 2017 AS year, 1 AS month UNION ALL
    SELECT 2017, 2  UNION ALL
    SELECT 2017, 3  UNION ALL
    SELECT 2017, 4  UNION ALL
    SELECT 2017, 5  UNION ALL
    SELECT 2017, 6  UNION ALL
    SELECT 2017, 7  UNION ALL
    SELECT 2017, 8  UNION ALL
    SELECT 2017, 9  UNION ALL
    SELECT 2017, 10 UNION ALL
    SELECT 2017, 11 UNION ALL
    SELECT 2017, 12
) t1
LEFT JOIN yourTable t2
    ON (t1.year >= YEAR(t2.start_date) AND t1.month >= MONTH(t2.start_date)) AND
       (t1.year <= YEAR(t2.end_date)   AND t1.month <= MONTH(t2.end_date))
GROUP BY t1.year, t1.month;

在下面的输出中,我显示2017年的所有月份。如果您只想报告项目非零数的月份,您可以将联接切换为INNER JOIN或添加HAVING子句检查项目计数。

<强>输出:

enter image description here

在这里演示:

Rextester