转换 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 |
你好,我在 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 |