我有一个带有日期范围的表。我想找出它是否与另一个范围重叠,并计算重叠的天数。
尝试仅在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
答案 0 :(得分:0)
尝试使用MySQL DATEDIFF()函数:
MySQL DATEDIFF()返回两个日期之间的天数,或者 日期时间。此函数仅从每个日期计算日期部分 表达。
DATEDIFF(expr1,expr2);
答案 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 |
+----+------------+------------+-------+