Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie sql sprawdzające wolny termin, na podstawie daty od i daty do
ze4lot
post
Post #1





Grupa: Zarejestrowani
Postów: 54
Pomógł: 1
Dołączył: 29.03.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Witam,

Przestudiowałem sobie już istniejące tematy na ten temat i albo coś mi nie działało albo dotyczyło odwrotnej sytuacji czyli zwracało wolne pokoje w danym terminie.

Do rzeczy:

Tabela reservations:
obj_id (id obiejktu/pokoju do rezerwacji),
date_from (data od),
date_to (data do)
status (załóżmy, że zawsze 1),

  1. SELECT * FROM `reservations` WHERE
  2. ((`date_from` <= $date_from AND `date_to` >= $date_from) OR
  3. (`date_from` <= $date_to AND `date_to` >= $date_to))
  4. AND `status` = 1 AND `obj_id` = $obj_id


Zapytanie zostało wygenerowane przez kod PHP (eloquent):

  1. protected function checkByStatus($obj_id, $date_from, $date_to, $status) {
  2.  
  3. $query = $this->newQuery();
  4. $query->where(function($query) use ($date_from, $date_to) {
  5. $query->where(function($query) use ($date_from) {
  6. $query->where('date_from', '<=', $date_from)
  7. ->where('date_to', '>=', $date_from);
  8. });
  9. $query->orWhere(function($query) use ($date_to) {
  10. $query->where('date_from', '<=', $date_to)
  11. ->where('date_to', '>=', $date_to);
  12. });
  13. });
  14. $query->where('status', $status);
  15. $query->where('obj_id', $obj_id);
  16. //return dd($query->toSql());
  17. if($query->count() == 0)
  18. return true;
  19. return false;
  20. }


Niestety powyższy kod nie działa prawidłowo i w niektórych przypadkach zwraca wolny termin pomimo, że nie jest wolny.
Bardzo proszę o pomoc w poprawieniu zapytania oraz odpowiedzenie na poniższe pytania:

1. Czy zmienne $date_to i $date_from mogą być zwykłymi stringami (2012-07-03)?
2. Czy właściwie ustawiłem typ kolumn date_from i date_to jako Date?

PS.
Jeżeli jest już na forum rozwiązanie to proszę o linka, mnie osobiście nie udało się znaleźć.



Ten post edytował ze4lot 9.07.2013, 13:05:05


--------------------
ze4lot.pl
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
buliq
post
Post #2





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Kod
SELECT * FROM `reservations` WHERE
((`date_from` <= $date_from AND `date_to` >= $date_from) OR
(`date_from` <= $date_to AND `date_to` >= $date_to))
AND `status` = 1 AND `obj_id` = $obj_id


data od jest mniejsza niż data od z formularza oraz data do jest większa niż data do z formularza
lub
data od jest mniejsza od daty do z formularza i data do jest większa niż data do z formularza

Ja tu widzę błąd logiczny (albo za długo nie mam co robić)


--------------------
KTOŚ TU PACZY???

Kompedium wiedzy
Go to the top of the page
+Quote Post
ze4lot
post
Post #3





Grupa: Zarejestrowani
Postów: 54
Pomógł: 1
Dołączył: 29.03.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedź, niestety zapytanie również nie jest poprawne, ponieważ np. przy zarezerwowanym już terminie od 2013.07.03 do 2013.07.06 termin od 2013.07.01 do 2013.07.07 jest uznany za wolny, co jest błędem.

Nie wyjaśniłem tego wcześniej ale np. mając już rezerwacje 2013.07.03 do 2013.07.06, terminy od 2013.07.06 są wolne, bo 07.06 nikt już nie nocuje.


--------------------
ze4lot.pl
Go to the top of the page
+Quote Post
buliq
post
Post #4





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Masz złe warunki, to źle wybiera

$date_from <= date_to and $date_from >= date_from and $date_to >= date_from and $date_to <= date_to


--------------------
KTOŚ TU PACZY???

Kompedium wiedzy
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #5





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  1. SELECT * FROM `reservations` WHERE
  2. ((`date_from`>= $date_to AND `date_to` <= $date_from)
  3. AND `status` = 1 AND `obj_id` = $obj_id


Ten post edytował mmmmmmm 10.07.2013, 11:17:37
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 03:17