转换 mysql 查询中的记录以显示开始日期和结束日期之间的每个月

Convert Records in a mysql query to show for every month between a start and end date

你好,我在 Mysql 中有一个 table/query 是这样的:

ActivityId | ActivityName | Start     | End        | 
1          | A            |05-06-2010 | 10-09-2010 |
2          | B            |01-09-2012 | 10-05-2013 |

我想生成月份并在开始日期和结束日期之间重复其他数据。 像这样

ActivityId | ActivityName | Start     | End        | Month   |
1          | A            |05-06-2010 | 10-09-2010 | 06-2010 |
1          | A            |05-06-2010 | 10-09-2010 | 07-2010 |
1          | A            |05-06-2010 | 10-09-2010 | 08-2010 |
1          | A            |05-06-2010 | 10-09-2010 | 09-2010 |
2          | B            |01-09-2012 | 10-05-2013 | 09-2012 |
2          | B            |01-09-2012 | 10-05-2013 | 10-2012 |
2          | B            |01-09-2012 | 10-05-2013 | 11-2012 |
2          | B            |01-09-2012 | 10-05-2013 | 12-2012 |
2          | B            |01-09-2012 | 10-05-2013 | 01-2013 |
2          | B            |01-09-2012 | 10-05-2013 | 02-2013 |
2          | B            |01-09-2012 | 10-05-2013 | 03-2013 |
2          | B            |01-09-2012 | 10-05-2013 | 04-2013 |
2          | B            |01-09-2012 | 10-05-2013 | 05-2013 |

您可以使用此查询(基于 this question 的答案)生成开始和结束月份之间的所有月份,以及 activity [=21= 中的相应值]:

SELECT ActivityId, ActivityName, Start, End, 
       DATE_FORMAT(Start + INTERVAL t1.i*10 + t0.i MONTH, '%m-%Y') AS Month
FROM
  (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0
CROSS JOIN
  (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1
JOIN activity ON DATE_FORMAT(Start + INTERVAL t1.i*10 + t0.i MONTH, '%Y-%m') <= DATE_FORMAT(End, '%Y-%m')
ORDER BY ActivityId, DATE_FORMAT(Start + INTERVAL t1.i*10 + t0.i MONTH, '%Y-%m')

输出:

ActivityId | ActivityName | Start     | End        | Month   |
1          | A            |05-06-2010 | 10-09-2010 | 06-2010 |
1          | A            |05-06-2010 | 10-09-2010 | 07-2010 |
1          | A            |05-06-2010 | 10-09-2010 | 08-2010 |
1          | A            |05-06-2010 | 10-09-2010 | 09-2010 |
2          | B            |01-09-2012 | 10-05-2013 | 09-2012 |
2          | B            |01-09-2012 | 10-05-2013 | 10-2012 |
2          | B            |01-09-2012 | 10-05-2013 | 11-2012 |
2          | B            |01-09-2012 | 10-05-2013 | 12-2012 |
2          | B            |01-09-2012 | 10-05-2013 | 01-2013 |
2          | B            |01-09-2012 | 10-05-2013 | 02-2013 |
2          | B            |01-09-2012 | 10-05-2013 | 03-2013 |
2          | B            |01-09-2012 | 10-05-2013 | 04-2013 |
2          | B            |01-09-2012 | 10-05-2013 | 05-2013 |

Demo on SQLFiddle