mysql两个日期之间的天数按月分组

mysql两个日期之间的天数按月分组,mysql,Mysql,我试图将两个日期过滤器之间的日期按月分组。是否可以在mysql中执行此操作 Example : StartDate : 2012-01-19 EndDate: 2012-03-24 查询应返回按月份分组的天数 Jan : 19 Feb : 29 Mar :24 Apr : 0 May : 0 etc 有办法做到这一点吗 谢谢 此查询将在有限的日期范围内(过去100000天)对您有效。但更好的方法是使用WHILE循环编写单独的函数或过程 SELECT DATE_FORMAT(_date,

我试图将两个日期过滤器之间的日期按月分组。是否可以在mysql中执行此操作

Example : StartDate : 2012-01-19  EndDate: 2012-03-24
查询应返回按月份分组的天数

Jan : 19
Feb  : 29
Mar :24
Apr : 0
May : 0 etc
有办法做到这一点吗


谢谢

此查询将在有限的日期范围内(过去100000天)对您有效。但更好的方法是使用
WHILE
循环编写单独的函数或过程

SELECT DATE_FORMAT(_date, '%M') AS month,
       COUNT(1) AS days
FROM (
        SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) + (10000 * e.a)) DAY AS _date
        FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS e
     ) a
WHERE _date BETWEEN '2012-01-19' AND '2012-03-24'
GROUP BY MONTH(_date)
ORDER BY MONTH(_date);

您在评论中的问题的新答案:我刚刚有一个问题,如何使用此查询连接到另一个表。基本思想是我有一个Bookings表,它有一个startDate和一个endDate,并使用这些作为_日期之间的参数,我需要找出每个月的天数。有没有关于我如何做到这一点的建议?还可以在单行而不是多行中返回结果:

见:


此查询将在有限的日期范围内(过去100000天)对您有效。但更好的方法是使用
WHILE
循环编写单独的函数或过程

SELECT DATE_FORMAT(_date, '%M') AS month,
       COUNT(1) AS days
FROM (
        SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) + (10000 * e.a)) DAY AS _date
        FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS e
     ) a
WHERE _date BETWEEN '2012-01-19' AND '2012-03-24'
GROUP BY MONTH(_date)
ORDER BY MONTH(_date);

您在评论中的问题的新答案:我刚刚有一个问题,如何使用此查询连接到另一个表。基本思想是我有一个Bookings表,它有一个startDate和一个endDate,并使用这些作为_日期之间的参数,我需要找出每个月的天数。有没有关于我如何做到这一点的建议?还可以在单行而不是多行中返回结果:

见:


如果您在所选答案中遇到问题,请尝试此选项,它非常适合MySQL 5.7+默认值:

SELECT
 YEAR(_date) AS year,
 MONTH(_date) AS month,
       COUNT(1) AS days
FROM (
        SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) + (10000 * e.a)) DAY AS _date
        FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS e
     ) a
WHERE _date BETWEEN '2018-01-01' AND '2018-10-11'
GROUP BY YEAR(_date), MONTH(_date)
ORDER BY MONTH(_date);

如果您在所选答案中遇到问题,请尝试此选项,它非常适合MySQL 5.7+默认值:

SELECT
 YEAR(_date) AS year,
 MONTH(_date) AS month,
       COUNT(1) AS days
FROM (
        SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) + (10000 * e.a)) DAY AS _date
        FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS d
        CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS e
     ) a
WHERE _date BETWEEN '2018-01-01' AND '2018-10-11'
GROUP BY YEAR(_date), MONTH(_date)
ORDER BY MONTH(_date);

顺便问一下,2012年2月还有29天:)在我为您编写代码之前,您确定只想使用MySQL吗?因为如果你只计算月份的天数,你可以只使用PHP,而不使用MySQL。如果有什么方法可以确定你想要计算的确切天数,请在我给出解决方案之前告诉我。哦,是的,当然是2月29日:)不幸的是,我只需要使用MySql来计算,尽管这可能会让它有点复杂。我想知道我们是否可以使用GROUP BY,但问题是它只考虑开始日期的月份,而不考虑相应的月份。非常感谢您的帮助/建议。谢谢顺便问一下,2012年2月还有29天:)在我为您编写代码之前,您确定只想使用MySQL吗?因为如果你只计算月份的天数,你可以只使用PHP,而不使用MySQL。如果有什么方法可以确定你想要计算的确切天数,请在我给出解决方案之前告诉我。哦,是的,当然是2月29日:)不幸的是,我只需要使用MySql来计算,尽管这可能会让它有点复杂。我想知道我们是否可以使用GROUP BY,但问题是它只考虑开始日期的月份,而不考虑相应的月份。非常感谢您的帮助/建议。谢谢非常感谢!:)你说的有限日期工作是什么意思?它只适用于同一年内的日期吗?它只适用于过去1000天,但您可以将日期范围扩展到10000、100000,。。。只需再添加一个
交叉联接
s就足够了。如果您得到了答案,请不要忘记接受最佳答案。我会这样做,因为它本身可以完美地工作。我有一个问题,如何使用此查询联接到另一个表。基本思想是我有一个Bookings表,它有一个startDate和一个endDate,并使用这些作为_日期之间的参数,我需要找出每个月的天数。有什么建议吗?是否可以在一行而不是多行中返回结果?谢谢!)你说的有限日期工作是什么意思?它只适用于同一年内的日期吗?它只适用于过去1000天,但您可以将日期范围扩展到10000、100000,。。。只需再添加一个
交叉联接
s就足够了。如果您得到了答案,请不要忘记接受最佳答案。我会这样做,因为它本身可以完美地工作。我有一个问题,如何使用此查询联接到另一个表。基本思想是我有一个Bookings表,它有一个startDate和一个endDate,并使用这些作为_日期之间的参数,我需要找出每个月的天数。有什么建议吗?是否可以在一行而不是多行中返回结果