Искать, есть ли в интервале между двумя датами другой интервал из двух дат - PullRequest
0 голосов
/ 16 июня 2020

У меня есть интервал, созданный из 2 дат.

с 28.06.2020 по 05.07.2020

если в этом интервале есть дата, которая добавляется в базу данных, он предупреждает меня, что в этом интервале есть дата, которая добавляется в базу данных.

база данных дат создается с помощью fullcalendar.

Я не могу заставить его уведомить меня также, если между выбранные даты с 28.06.2020 по 05.07.2020, есть не только одна дата, но и интервал, например с 31.06.2020 по 07.03.2020

Или также в случае выбранная дата: 28.06.2020 по 05.07.2020, но в базе есть интервал с 26.06.20202 по 29.06.2020.

Возможно ли это сделать?

для одной даты без интервалов и использовал это:

$paymentDate=date('Y-m-d', strtotime("03/07/2020"));
$contractDateBegin = date('Y-m-d', strtotime("28/06/2020"));
$contractDateEnd = date('Y-m-d', strtotime("07/07/2020"));

if (($paymentDate >= $contractDateBegin) && ($paymentDate <= $contractDateEnd)){
    echo "is between";
}else{
    echo "NO GO!";  
}

bd fullcalendar.

    --
-- Table structure for table `events_laboral`
--

CREATE TABLE `events_laboral` (
  `id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `color` varchar(7) DEFAULT NULL,
  `start` datetime NOT NULL,
  `end` datetime DEFAULT NULL,
  `empresa` text NOT NULL,
  `usuario` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `events_laboral`
--

интервал даты bd.

--
-- Table structure for table `vacanciones`
--

CREATE TABLE `vacanciones` (
  `id` int(255) NOT NULL,
  `empresa` text NOT NULL,
  `usuario` text NOT NULL,
  `fecha_inicio` text NOT NULL,
  `fecha_final` text NOT NULL,
  `fecha_peticion` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `fecha_cambio` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `status` text NOT NULL,
  `mesaje` longtext NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `vacanciones`
--

edit: я думал о php поиске между двумя выбранными датами, если есть дата начала или окончания любого события. И если он дает положительную дату начала, она рассчитывается между началом и концом выбранной даты интервала, сообщая пользователю, что выбранное количество дней уже есть в базе данных.

1 Ответ

0 голосов
/ 16 июня 2020

Учитывайте следующее:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(event_id CHAR(1)
,event_start DATE NOT NULL
,event_end DATE NOT NULL
,PRIMARY KEY(event_id)
);

INSERT INTO my_table VALUES
('A','2020-06-28','2020-07-05'),
('B','2020-06-26','2020-06-29'),
('C','2020-07-04','2020-07-05'),
('D','2020-07-06','2020-07-07');

SELECT x.* 
     , y.event_id clashes_with_event
  FROM my_table x 
  JOIN my_table y 
    ON y.event_id <> x.event_id 
   AND y.event_start <= x.event_end 
   AND y.event_end >= x.event_start;

+----------+-------------+------------+--------------------+
| event_id | event_start | event_end  | clashes_with_event |
+----------+-------------+------------+--------------------+
| B        | 2020-06-26  | 2020-06-29 | A                  |
| C        | 2020-07-04  | 2020-07-05 | A                  |
| A        | 2020-06-28  | 2020-07-05 | B                  |
| A        | 2020-06-28  | 2020-07-05 | C                  |
+----------+-------------+------------+--------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...