在 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
我的数据如下所示:
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