【问题标题】:List of months within multiple date ranges in mysqlmysql中多个日期范围内的月份列表
【发布时间】:2018-02-03 01:12:29
【问题描述】:

我有一个日期范围列表,我想获得这些日期范围内所有月份的列表。我可以像这样查询我的日期范围:

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

这里已经有关于如何获取两个日期之间月份列表的示例,例如:

但这些示例是关于单个日期范围的,但我有多个日期范围。如果有人能找到我的问题的 sql 查询,那就太好了。

【问题讨论】:

  • 你的问题有点混乱。您想要日期范围内的所有月份,还是只需要范围内每个开始/结束日期的月份/年份?
  • @Sloan:我希望所有月份都在日期范围内。因此,如果一个日期范围跨越 5 个月,则应显示所有 5 个月。
  • 这确实是一个显示问题,因此,最好在应用程序代码中解决
  • 你可以使用distinct(month(date))

标签: mysql date date-range


【解决方案1】:

这里有一个解决方案:

#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 (尚未)包含行生成器的限制,因此需要解决方法。

问候,

詹姆斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多