在 SQL 中的日期范围之间迭代

Iterate between date range in SQL

我的数据如下所示:

start_date | end_date   | value
-----------------------------
2022-01-01   2022-01-05   10
2022-01-01   2022-01-04   5
2022-01-03   2022-01-06   100

我想对已开始但尚未结束的行的值求和。对于一个约会我可以写

SELECT SUM(value) FROM `xxx` WHERE start_date <= '2022-01-04' AND end_date > '2022-01-04');

获取 1 月 4 日 (110) 的所有“打开”行。

在单个查询中获取 SQL 中两个日期之间每一天的这些值的最简单方法是什么?这是一个 MariaDB 服务器。

理想情况下,结果应该是这样的:

date       | open_values
------------------------
2022-01-01   15
2022-01-02   15
2022-01-03   115
2022-01-04   110
2022-01-05   100
2022-01-06   0

感谢您的帮助!

使用 calendar table 到 return 各个日期。加入它并使用条件 SUM 计算每天的总数 value

SELECT c.CalendarDate
       , SUM( IF(t.End_Date > c.CalendarDate, t.value, 0) ) AS TotalValue
FROM   CalendarTable c INNER JOIN YourTable t 
            ON t.Start_Date <= c.CalendarDate
            AND t.End_Date >= c.CalendarDate
GROUP BY c.CalendarDate 
ORDER BY c.CalendarDate
;

结果:

CalendarDate | TotalValue
:----------- | ---------:
2022-01-01   |         15
2022-01-02   |         15
2022-01-03   |        115
2022-01-04   |        110
2022-01-05   |        100
2022-01-06   |          0

从技术上讲,您也可以使用 CTE。但是,日历 table 会更有效率。

-- Demo: Generate 1 year's worth of dates
WITH recursive CalendarCTE AS (
   SELECT '2022-01-01' AS CalendarDate
   UNION ALL
   SELECT DATE_ADD(CalendarDate, INTERVAL 1 DAY)
   FROM   CalendarCTE
   WHERE  CalendarDate < '2023-01-01'
)
-- INSERT INTO CalendarTable (CalendarDate)
SELECT c.CalendarDate
       , SUM( IF(t.End_Date > c.CalendarDate, t.value, 0) ) AS TotalValue
FROM   CalendarCTE c INNER JOIN YourTable t 
            ON t.Start_Date <= c.CalendarDate
            AND t.End_Date >= c.CalendarDate
GROUP BY c.CalendarDate 
ORDER BY c.CalendarDate
;

db<>fiddle here