【问题标题】:How to create row data for a date range with SQL如何使用 SQL 为日期范围创建行数据
【发布时间】:2021-10-21 00:03:30
【问题描述】:

表格如下所示:

---+------------+------------+---------
id | start_date | end_date   | amount |
---+------------+------------+---------
 1 | 2021-01-01 | 2021-01-07 | 100    |
---+------------+------------+---------

我想把上面的表格改成下面的。

---+------------+------------+--------+---------------+
id | start_date | end_date   | amount | operation_date|
---+------------+------------+--------+---------------+
 1 | 2021-01-01 | 2021-01-07 | 100    | 2021-01-01    |
 1 | 2021-01-01 | 2021-01-07 | 100    | 2021-01-02    |
 1 | 2021-01-01 | 2021-01-07 | 100    | 2021-01-03    |
 1 | 2021-01-01 | 2021-01-07 | 100    | 2021-01-04    |
 1 | 2021-01-01 | 2021-01-07 | 100    | 2021-01-05    |
 1 | 2021-01-01 | 2021-01-07 | 100    | 2021-01-06    |
 1 | 2021-01-01 | 2021-01-07 | 100    | 2021-01-07    |
---+------------+------------+--------+---------------+

我想把操作日期按照开始日期和结束日期的范围排成一行,并输入相同的信息。

你能帮忙吗?我做了很多搜索,但找不到合适的答案。

【问题讨论】:

  • 什么 MySQL 版本?
  • @FaNo_FN 我正在使用 Redshift。是不是 MySQL 8.0 代码也没关系。

标签: mysql sql amazon-redshift


【解决方案1】:

我认为你可以使用RECURSIVE CTE like:

WITH RECURSIVE cte AS (
SELECT id, start_date, end_date, amount, start_date AS operation_date 
FROM table1 
 UNION ALL
SELECT id, start_date, end_date, amount, operation_date+INTERVAL 1 DAY 
FROM cte 
 WHERE operation_date+INTERVAL 1 DAY <= end_date)
  SELECT * 
    FROM cte ;
id start_date end_date amount operation_date
1 2021-01-01 2021-01-07 100 2021-01-01
1 2021-01-01 2021-01-07 100 2021-01-02
1 2021-01-01 2021-01-07 100 2021-01-03
1 2021-01-01 2021-01-07 100 2021-01-04
1 2021-01-01 2021-01-07 100 2021-01-05
1 2021-01-01 2021-01-07 100 2021-01-06
1 2021-01-01 2021-01-07 100 2021-01-07

Here's a demo fiddle

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多