Найти даты в диапазоне, используя запрос - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь проверить или проверить даты в диапазоне, используя Oracle sql, и попробовал что-то вроде этого:

SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND M.LV_FROM >= '17-OCT-2018' AND M.LV_TO <= '18-OCT-2018';


Date Range: Start - End
            20-OCT-2018 - 22-OCT-2018 //This worked when checked

Это прекрасно работает для определенного диапазона дат.Но что, если у меня есть следующие диапазоны дат

Date Range: Start - End
            22-OCT-2018 - 22-OCT-2018 //Date range 1 - in Database Table
            18-OCT-2018 - 22-OCT-2018 //Date range 2 - User input
            22-OCT-2018 - 24-OCT-2018 //Date range 2 - User input; Even this should be validated

См. Выше 22-OCT-2018 уже выделено для Таблица базы данных диапазон дат и всякий раз, когдакаждый пытается выделить это снова, должен выдать ошибку или, по крайней мере, увеличить диапазон.Я пытался что-то глупое, как это, наоборот, но застрял:

SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND M.LV_FROM >= '17-OCT-2018' AND M.LV_TO <= '18-OCT-2018'
OR M.LV_TO >= '17-OCT-2018' AND M.FROM <= '18-OCT-2018';

NB: В основном это для системы управления отпуском.Таким образом, всякий раз, когда в диапазоне выделяется дата, она должна проверяться.Ниже приведены три условия:

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

Кредит отправляется @Corion за предложение по редактированию - спасибо.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Если вы хотите перекрытия, то логика такова:

SELECT m.*
FROM VW_LEAVEDETAILS m
WHERE M.EMPNO = '123456' AND
      M.LV_TO >= DATE '2018-10-17' AND
      M.LV_FROM <= DATE '2018-10-18';

Два периода перекрываются, если один начинается до окончания второго, а первый заканчивается после второго запуска (конечные точки могут быть или не быть включеныв зависимости от вашей логики перекрытия).

0 голосов
/ 28 октября 2018

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

Может быть три типа перекрытия:

  1. LV_FROM между начальным и конечным датами пользователя.
  2. LV_TO между начальным и конечным датами пользователя.
  3. LV_FROM перед началом пользователя и LV_TO после окончания пользователяdate.

Итак, давайте обратимся к этим трем условиям:

SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND (
    (M.LV_FROM between '17-OCT-2018' AND '18-OCT-2018')
 or (M.LV_TO   between '17-OCT-2018' AND '18-OCT-2018')
 or (M.LV_FROM <       '17-OCT-2018' AND M.LV_TO > '18-OCT-2018')
);

Если вы можете предоставить больше информации и примеров данных, которые могут помочь нам дать лучшие ответы.

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