找出mysql中两个日期范围之间重叠的天数

时间:2019-06-24 07:15:39

标签: mysql date

我有一个带有日期范围的表。我想找出它是否与另一个范围重叠,并计算重叠的天数。

尝试仅在mysql中完成此操作,而无需经过前端语言PHP的循环。

id | start_date | end_date
1  | 2019-01-02 | 2019-01-07
2  | 2019-01-03 | 2019-01-03
3  | 2019-01-06 | 2019-01-09

日期范围start = 2019-01-04,日期范围end = 2019-01-07

日期在format YYYY-MM-DD

希望最终结果是:

id | start_date | end_date    | total_days
1  | 2019-01-02 | 2019-01-07  | 4
2  | 2019-01-03 | 2019-01-03  | 0
3  | 2019-01-05 | 2019-01-09  | 3

2 个答案:

答案 0 :(得分:0)

尝试使用MySQL DATEDIFF()函数:

  

MySQL DATEDIFF()返回两个日期之间的天数,或者   日期时间。此函数仅从每个日期计算日期部分   表达。

DATEDIFF(expr1,expr2);

Click here to find examples

答案 1 :(得分:-1)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,start_date DATE NOT NULL
,end_date DATE NOT NULL
);

INSERT INTO my_table VALUES
(1,'2019-01-02','2019-01-07'),
(2,'2019-01-03','2019-01-03'),
(3,'2019-01-06','2019-01-09');

SELECT x.*
     , COALESCE(DATEDIFF(LEAST(y.end_date,'2019-01-07'),GREATEST(y.start_date,'2019-01-04')) + 1 ,0) delta
  FROM my_table x 
  LEFT 
  JOIN my_table y
    ON y.id = x.id
   AND y.start_date <= '2019-01-07' 
   AND y.end_date >= '2019-01-04';
+----+------------+------------+-------+
| id | start_date | end_date   | delta |
+----+------------+------------+-------+
|  1 | 2019-01-02 | 2019-01-07 |     4 |
|  2 | 2019-01-03 | 2019-01-03 |     0 |
|  3 | 2019-01-06 | 2019-01-09 |     2 |
+----+------------+------------+-------+