如何使用一组数据为mysql中的每个ID生成两个日期之间的日期列表

如何使用一组数据为mysql中的每个ID生成两个日期之间的日期列表,mysql,Mysql,这是每个ID的表数据,我需要将其作为参数传递,并为每个ID生成日期列表,然后插入到表中 ID startdate enddate 1 2016-01-01 2020-12-31 2 2017-01-01 2020-12-31 3 2018-01-01 2020-12-31 4 2019-01-01 2020-12-31 5 2020-01-01 2020-12-31 此存储过程通过参数为单个值运行: DELIMITER @@ DROP PROCEDURE ma

这是每个
ID
的表数据,我需要将其作为参数传递,并为每个ID生成日期列表,然后插入到表中

ID  startdate  enddate
1   2016-01-01  2020-12-31
2   2017-01-01  2020-12-31
3   2018-01-01  2020-12-31
4   2019-01-01  2020-12-31
5   2020-01-01  2020-12-31
此存储过程通过参数为单个值运行:

DELIMITER @@
DROP PROCEDURE make_intervals @@
CREATE PROCEDURE vtproject.make_intervals
(IN `startdate` DATE, IN `enddate` DATE)
BEGIN
    declare thisDate DATE;
    declare nextDate DATE;
    declare intval integer;
    declare unitval varchar(10);

    set thisDate = startdate;
    set intval = 1;
    set unitval = 'YEAR';

    drop temporary table if exists year_intervals;
    create temporary table if not exists year_intervals
      (
      interval_start DATE,
      interval_end DATE
      );

    repeat
      select
         case unitval
            when 'MICROSECOND' then timestampadd(MICROSECOND, intval, thisDate)
            when 'SECOND'      then timestampadd(SECOND, intval, thisDate)
            when 'MINUTE'      then timestampadd(MINUTE, intval, thisDate)
            when 'HOUR'        then timestampadd(HOUR, intval, thisDate)
            when 'DAY'         then timestampadd(DAY, intval, thisDate)
            when 'WEEK'        then timestampadd(WEEK, intval, thisDate)
            when 'MONTH'       then timestampadd(MONTH, intval, thisDate)
            when 'QUARTER'     then timestampadd(QUARTER, intval, thisDate)
            when 'YEAR'        then timestampadd(YEAR, intval, thisDate)
         end into nextDate;

      insert into year_intervals select thisDate, dateadd(DAY, -1, nextDate);
      set thisDate = nextDate;
    until thisDate >= enddate
    end repeat;
    select * from year_intervals;
END @@ 
DELIMITER ; 

下面有两个版本。第一个是通过一对日期来完成的。第二个版本通过游标一次处理整个表

第1版:

DROP PROCEDURE if exists make_intervals;
DELIMITER @@CREATE PROCEDURE make_intervals
(IN `startdate` DATE, IN `enddate` DATE)
BEGIN
    declare thisDate DATE;
    declare nextDate DATE;
    declare intval integer;
    declare unitval varchar(10);

    set thisDate = startdate;
    set intval = 1;
    set unitval = 'YEAR';

    drop temporary table if exists year_intervals;
    create temporary table if not exists year_intervals
      (
      interval_start DATE,
      interval_end DATE
      );

    repeat
      select
         case unitval
            when 'MICROSECOND' then timestampadd(MICROSECOND, intval, thisDate)
            when 'SECOND'      then timestampadd(SECOND, intval, thisDate)
            when 'MINUTE'      then timestampadd(MINUTE, intval, thisDate)
            when 'HOUR'        then timestampadd(HOUR, intval, thisDate)
            when 'DAY'         then timestampadd(DAY, intval, thisDate)
            when 'WEEK'        then timestampadd(WEEK, intval, thisDate)
            when 'MONTH'       then timestampadd(MONTH, intval, thisDate)
            when 'QUARTER'     then timestampadd(QUARTER, intval, thisDate)
            when 'YEAR'        then timestampadd(YEAR, intval, thisDate)
         end into nextDate;

      insert into year_intervals select thisDate, date_add(nextDate,INTERVAL -1 DAY);
      set thisDate = nextDate;
    until thisDate >= enddate
    end repeat;
    select * from year_intervals;
END @@ 
DELIMITER ; 
测试:

版本2(使用2个不同参数重新加工,整个表格):

测试:

测试另一个

call make_intervals_v2('WEEK',2);


上面的循环(光标和repeat/until的双循环)执行起来并不那么出色。我可以重做。这只是你可以做的一个例子。

下面有两个版本。第一个是通过一对日期来完成的。第二个版本通过游标一次处理整个表

第1版:

DROP PROCEDURE if exists make_intervals;
DELIMITER @@CREATE PROCEDURE make_intervals
(IN `startdate` DATE, IN `enddate` DATE)
BEGIN
    declare thisDate DATE;
    declare nextDate DATE;
    declare intval integer;
    declare unitval varchar(10);

    set thisDate = startdate;
    set intval = 1;
    set unitval = 'YEAR';

    drop temporary table if exists year_intervals;
    create temporary table if not exists year_intervals
      (
      interval_start DATE,
      interval_end DATE
      );

    repeat
      select
         case unitval
            when 'MICROSECOND' then timestampadd(MICROSECOND, intval, thisDate)
            when 'SECOND'      then timestampadd(SECOND, intval, thisDate)
            when 'MINUTE'      then timestampadd(MINUTE, intval, thisDate)
            when 'HOUR'        then timestampadd(HOUR, intval, thisDate)
            when 'DAY'         then timestampadd(DAY, intval, thisDate)
            when 'WEEK'        then timestampadd(WEEK, intval, thisDate)
            when 'MONTH'       then timestampadd(MONTH, intval, thisDate)
            when 'QUARTER'     then timestampadd(QUARTER, intval, thisDate)
            when 'YEAR'        then timestampadd(YEAR, intval, thisDate)
         end into nextDate;

      insert into year_intervals select thisDate, date_add(nextDate,INTERVAL -1 DAY);
      set thisDate = nextDate;
    until thisDate >= enddate
    end repeat;
    select * from year_intervals;
END @@ 
DELIMITER ; 
测试:

版本2(使用2个不同参数重新加工,整个表格):

测试:

测试另一个

call make_intervals_v2('WEEK',2);


上面的循环(光标和repeat/until的双循环)执行起来并不那么出色。我可以重做。这只是你能做的一个例子。

Drew比我领先两步。我不知道你在说什么。你是使用MySQL还是MariaDB V10.x.x?Drew比我早几步。我不知道你在说什么。是否使用MySQL或MariaDB V10.x.x?我非常想要的绝妙解决方案,谢谢先生,非常感谢。我非常想要的绝妙解决方案,谢谢先生,非常感谢。
call make_intervals_v2('WEEK',2);