Zakres dat

0

Witam!
Potrzebuję wyciągnąć z bazy rekordy - numery pokoi, które są zarezerwowane w podanym przedziale czasowym.
Np jeśli podam datę przyjazdu(date_ar) 2017-10-13 i datę wyjazdu(date_dep) 2017-10-18 chcę żeby wyświetliło zarówno rezerwacje dokładnie w tym terminie jak i te np na 2017-10-15 do 2017-10-18 czyli mieszczące się w tym przedziale, ale nieodpowiadające mu co do dnia.

Zapytanie: "SELECT * FROM jos_program_reservation WHERE (date_ar BETWEEN '2017-10-13' AND '2017-10-18') AND (date_dep BETWEEN '2017-10-13' AND '2017-10-18')" wyświetla mi tylko rezerwacje dokładnie z powyższego przedziału, natomiast jeśli podam 10-15 zamiast 10-13 to rezerwacji na 10-13 do 10-18 już mi nie wyświetli mimo że istnieje ona w bazie i ma datę wyjazdu mieszczącą się w podanym przedziale.

Proszę o pomoc. Potrzebuję wyświetlić numery pokoi zajętych w danym terminie żeby potem na ich podstawie wyświetlić z innej tabeli listę tylko tych wolnych do wyboru przy dodawaniu nowej rezerwacji.

1
select * from x where data_od<'2017-03-15' and data_do>'2017-01-15'
0

Temat możemy rozpatrzyć w czterech przypadkach:

  1. Planowana rezerwacja zahacza o początek istniejącej rezerwacji
  2. Planowana rezerwacja zahacza o koniec istniejącej rezerwacji
  3. Planowana rezerwacja obejmuje istniejącą
  4. Planowana rezerwacja zawiera się w istniejącej rezerwacji

Poniżej zapytanie uwzględniające wszystkie przypadki połączone za pomocą UNION ALL ze względu na lepszą wydajność w stosunku do budowania warunków z OR (przy założeniu istnienia indeksu na kolumnach date_ar i date_dep).

Istotne jest wyizolowanie wybranych przypadków (zapisane warunki właśnie to robią), żeby można było skorzystać z UNION ALL zamiast UNION.

Zmienne w zapytaniu są dodane tylko dla zwiększenia czytelności - nie są potrzebne - w ich miejsce można wstawić stałe daty.

SET @dateWantedReservationAr = '2017-03-15'
;

SET @dateWantedReservationDep = '2017-03-18'
;


SELECT
                *
FROM
                jos_program_reservation JPR
WHERE
                JPR.date_ar BETWEEN @dateWantedReservationAr AND @dateWantedReservationDep
                AND JPR.date_dep > @dateWantedReservationDep

UNION ALL

SELECT
                *
FROM
                jos_program_reservation JPR
WHERE
                JPR.date_dep BETWEEN @dateWantedReservationAr AND @dateWantedReservationDep
                AND JPR.date_ar < @dateWantedReservationAr
                
UNION ALL

SELECT
                *
FROM
                jos_program_reservation JPR
WHERE
                JPR.date_ar BETWEEN @dateWantedReservationAr AND @dateWantedReservationDep
                AND JPR.date_dep BETWEEN @dateWantedReservationAr AND @dateWantedReservationDep
                
UNION ALL

SELECT
                *
FROM
                jos_program_reservation JPR
WHERE
                @dateWantedReservationAr BETWEEN JPR.date_ar AND JPR.date_dep
                AND @dateWantedReservationDep BETWEEN JPR.date_ar AND JPR.date_dep
;

[Adam]

1 użytkowników online, w tym zalogowanych: 0, gości: 1