Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL插入缺少日期的行_Mysql_Sql_Date_Recursive Query - Fatal编程技术网

MYSQL插入缺少日期的行

MYSQL插入缺少日期的行,mysql,sql,date,recursive-query,Mysql,Sql,Date,Recursive Query,我有一个包含两列的表: 名称 日期 AA 2021-06-01 BB 2021-06-02 科科斯群岛 2021-05-28 对于MySQL的最新版本,您可以 DROP TABLE IF EXISTS my_table; CREATE TABLE my_table (name CHAR(2) NOT NULL ,date DATE NOT NULL ,PRIMARY KEY(name,date) ); INSERT INTO my_table VALUES ('AA','2021-06-01'

我有一个包含两列的表:

名称 日期 AA 2021-06-01 BB 2021-06-02 科科斯群岛 2021-05-28
对于MySQL的最新版本,您可以

DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(name CHAR(2) NOT NULL
,date DATE NOT NULL
,PRIMARY KEY(name,date)
);

INSERT INTO my_table VALUES
('AA','2021-06-01'),
('BB','2021-06-02'),
('CC','2021-05-28');

WITH RECURSIVE cte AS
(
  SELECT MIN(date) date FROM my_table 
   UNION ALL
  SELECT date + INTERVAL 1 DAY 
    FROM cte
   WHERE date + INTERVAL 1 DAY <= '2021-06-03'
)
SELECT x.name
     , cte.date
  FROM my_table x
  JOIN cte
    ON cte.date >= x.date
 ORDER 
    BY name
     , date


| name | date       |
| ---- | ---------- |
| AA   | 2021-06-01 |
| AA   | 2021-06-02 |
| AA   | 2021-06-03 |
| BB   | 2021-06-02 |
| BB   | 2021-06-03 |
| CC   | 2021-05-28 |
| CC   | 2021-05-29 |
| CC   | 2021-05-30 |
| CC   | 2021-05-31 |
| CC   | 2021-06-01 |
| CC   | 2021-06-02 |
| CC   | 2021-06-03 |

---

[View on DB Fiddle](https://www.db-fiddle.com/f/wL3ZqXoTqdKftJCPA4um4j/1)     
对于旧版本,可以使用uility表。例如,我有一个整数I的表,值从0到9

SELECT y.name
     , x.date 
  FROM 
     ( SELECT MIN(date) + INTERVAL i DAY date FROM my_table,ints GROUP BY i HAVING date <= '2021-06-03' ) x 
  JOIN my_table y 
    ON y.date <= x.date 
 ORDER 
    BY name
     , date;
+------+------------+
| name | date       |
+------+------------+
| AA   | 2021-06-01 |
| AA   | 2021-06-02 |
| AA   | 2021-06-03 |
| BB   | 2021-06-02 |
| BB   | 2021-06-03 |
| CC   | 2021-05-28 |
| CC   | 2021-05-29 |
| CC   | 2021-05-30 |
| CC   | 2021-05-31 |
| CC   | 2021-06-01 |
| CC   | 2021-06-02 |
| CC   | 2021-06-03 |
+------+------------+

您希望从表中的行生成日期为“2021-06-03”的行。您可以使用递归CTE直接执行此操作:

with recursive cte as (
      select name, date
      from t
      union all
      select name, date + interval 1 day
      from cte
      where date < '2021-06-03'
     )
select *
from cte
order by name, date;
他是一把小提琴

您可以将递归CTE读取为:

从给定表中的行开始。 给日期加上一天。 当日期为结束日期时停止。
这不仅比生成所有日期然后加入更简单,而且应该更快。

版本是5.7.33。这在8.0+中要简单得多。如果您可以更新,请考虑这样做。嗨,尝试更低版本的代码并有错误。从我的表格中选择MINdate+间隔i天日期,?ints??按日期分组如果我正在使用MySQL版本8.0+,这将是完美的,我很遗憾不能更改它。@PriyaPatel。你的问题被标记为递归cte。正如问题所问,这使用了递归CTE。是的,很抱歉,我后来发现我的版本不支持递归CTE。