You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现输入两个日期参数,自动生成连续时间行的查询功能?

刚好做过类似的需求!要实现输入两个年月参数返回连续年月序列,不同数据库的实现思路略有不同,我给你分别说说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');

返回结果就是你要的连续年月:

YearMonth
20135
20136
......
201312
......
20191
20192
20193

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:47:19