mysql中多个日期范围内的月份列表
问题描述:
我有一个日期范围列表,我希望获取这些日期范围内所有月份的列表。我可以查询我的日期范围,像这样:mysql中多个日期范围内的月份列表
Select id, start, end
From date_range
而这个查询将给出以下的输出:
1, 01-01-2016, 25-03-2016
2, 26-03-2016, 30-03-2016
3, 30-12-2016, 08-01-2017
现在我想找到一个MySQL查询,只是列出了这些日期范围内的所有月份。所以应该给下面的输出:
01-2016
02-2016
03-2016
12-2016
01-2017
已经有例子在这里如何获得两个日期之间,例如在本月的列表:
- Creating a list of month names between two dates in MySQL
- How to get a list of months between two dates in mysql
但这些例子是关于单个日期范围,但我有多个日期范围。如果有人可以为我的问题找到一个sql查询,那将会很棒。
答
这里是一个解决方案:
#DROP TABLE IF EXISTS monthTest;
CREATE TABLE monthTest(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `start` DATETIME, `end`DATETIME);
INSERT INTO monthTest(`start`, `end`) VALUES
('2016-01-01', '2016-03-25'),
('2016-03-26', '2016-03-30'),
('2016-12-30', '2017-08-01');
SELECT A.`start`, A.`end`, DATE_FORMAT(DATE_ADD(A.`start`, INTERVAL B.help_keyword_id MONTH), '%Y%m') FROM
monthTest A,
mysql.help_keyword B
WHERE PERIOD_DIFF(DATE_FORMAT(A.`end`, '%Y%m'), DATE_FORMAT(A.`start`, '%Y%m')) >= B.help_keyword_id
ORDER BY A.id;
注意这个查询在第二JOIN
表具有相关性,该表必须包含数月的任意两个日期和连接字段之间必须最大数量更多的行从0开始递增INTEGER
。这是由于mysql没有(还)包含行生成器的限制,所以需要解决方法。
问候,
詹姆斯
你的问题是有点混乱。你想要在日期范围内的所有月份,或只是范围内每个开始/结束日期的月份/年份? –
@Sloan:我想要在日期范围内的所有月份。所以如果一个日期范围跨越5个月,那么应该出现所有5个月。 –
这实际上是一个显示问题,因此,最好在应用程序代码 – Strawberry