计算daterange中daterange的天数

时间:2019-05-16 08:38:15

标签: mysql mariadb

我想计算一个开始日期和结束日期在另一个开始日期和结束日期中有多少天。基本上:日期01.06.2020-06.06.2020多少天在日期03.06.2020-31.12.2020内。在这种情况下,答案是4。2020年6月3日,4日,5日和6日。

我知道我可以使用TIMESTAMPDIFF在2个日期之间进行计算,但是我无法用一个简单的解决方案来处理2个日期内的2个日期。

我不敢相信没有人问过这个问题,但是我找不到任何解决方案。

简单表:

+-------------+--------------+
| Start_date  |  End_date    | 
+-------------+--------------+          
| 2020-06-03  |  2020-12-31  |
| 2014-09-08  |  2015-09-07  | 
| 2015-01-15  |  2015-02-01  |
+-------------+--------------+

我正在寻找一些类似的东西:

SELECT * FROM available_dates WHERE TIMESTAMPDIFF(DAY,'2020-06-01','2020-06-06', Start_date, End_date) > 5

1 个答案:

答案 0 :(得分:1)

您可以通过在开始日期使用GREATEST在结束日期使用LEAST来获取两个范围的交集来进行此操作。相交范围将返回一个正数,而不相交一个负数。因此,我们再次使用GREATEST将负值清零以获得重叠。例如:

CREATE TABLE test (
  `Start_date` DATE,
  `End_date` DATE
);

INSERT INTO test
  (`Start_date`, `End_date`)
VALUES
  ('2020-06-03', '2020-12-31'),
  ('2014-09-08', '2015-09-07'),
  ('2015-01-15', '2015-02-01');

SET @start = '2015-01-20';
SET @end = '2015=02-04';
SELECT GREATEST(TIMESTAMPDIFF(DAY, GREATEST(Start_Date, @start), LEAST(End_Date, @end))+1, 0) AS overlap
FROM test;

输出:

overlap
0
16
13

Create Missing Index From the Actual Execution Plan