如何实现输入两个日期参数,自动生成连续时间行的查询功能?
刚好做过类似的需求!要实现输入两个年月参数返回连续年月序列,不同数据库的实现思路略有不同,我给你分别说说PostgreSQL和MySQL的方案吧:
PostgreSQL 实现
PostgreSQL自带的generate_series函数简直是生成序列的神器,我们可以利用它来快速生成连续的月份日期,再提取年月即可。
先创建这个函数:
CREATE OR REPLACE FUNCTION generate_month_series(start_date text, end_date text) RETURNS TABLE(year integer, month integer) AS $$ BEGIN RETURN QUERY SELECT EXTRACT(YEAR FROM generate_date)::integer AS year, EXTRACT(MONTH FROM generate_date)::integer AS month FROM generate_series( TO_DATE(start_date, 'YYYY/MM'), TO_DATE(end_date, 'YYYY/MM'), '1 month'::interval ) AS generate_date; END; $$ LANGUAGE plpgsql;
调用方式完全符合你的需求:
SELECT * FROM generate_month_series('2013/5','2019/3');
返回结果就是你要的连续年月:
| Year | Month |
|---|---|
| 2013 | 5 |
| 2013 | 6 |
| ... | ... |
| 2013 | 12 |
| ... | ... |
| 2019 | 1 |
| 2019 | 2 |
| 2019 | 3 |
MySQL 实现
MySQL没有自带的序列生成函数,不过我们可以用循环来实现。这里给你写一个基于循环的函数:
DELIMITER // CREATE FUNCTION generate_month_series(start_date VARCHAR(7), end_date VARCHAR(7)) RETURNS TABLE(year INT, month INT) BEGIN DECLARE current_year INT; DECLARE current_month INT; DECLARE end_year INT; DECLARE end_month INT; -- 解析输入的年月参数 SET current_year = SUBSTRING(start_date, 1, 4); SET current_month = SUBSTRING(start_date, 6, 2); SET end_year = SUBSTRING(end_date, 1, 4); SET end_month = SUBSTRING(end_date, 6, 2); -- 创建临时表存储结果 DROP TABLE IF EXISTS temp_months; CREATE TEMPORARY TABLE temp_months (year INT, month INT); -- 循环生成每个年月 WHILE (current_year < end_year) OR (current_year = end_year AND current_month <= end_month) DO INSERT INTO temp_months VALUES (current_year, current_month); SET current_month = current_month + 1; -- 月份超过12时切换年份 IF current_month > 12 THEN SET current_month = 1; SET current_year = current_year + 1; END IF; END WHILE; -- 返回结果 RETURN SELECT * FROM temp_months; END // DELIMITER ;
调用方式同样是:
SELECT * FROM generate_month_series('2013/5','2019/3');
注意事项
- 如果你的输入日期格式不是
YYYY/MM,记得调整函数里的日期解析逻辑(比如PostgreSQL的TO_DATE第二个参数,MySQL的SUBSTRING截取位置)。 - PostgreSQL 12+版本也可以用纯SQL函数替代PL/pgSQL,代码会更简洁。
内容的提问来源于stack exchange,提问作者Wei Lin
相关产品推荐
相关产品推荐

