Подсчитать количество дней в дате - PullRequest
0 голосов
/ 16 мая 2019

Я хочу посчитать, сколько дней начальной и конечной даты находятся внутри другой начальной и конечной даты.В основном: Сколько дней с даты 01.06.2020 по 06.06.2020 находится внутри даты с 03.06.2020 по 31.12.2020.В этом случае ответ будет 4. 3, 4, 5 и 6 июня 2020 года.

Я знаю, что могу использовать TIMESTAMPDIFF для выполнения расчетов между двумя датами, но я не могу обернуть головупростое решение сделать это с 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 Ответ

1 голос
/ 16 мая 2019

Вы можете сделать это, взяв пересечение двух диапазонов, используя 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

Демонстрация по dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...