Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] wyszukiwanie wg daty
Forum PHP.pl > Forum > Bazy danych > MySQL
parzol
Witam ponownie.

Tym razem chciałbym wyszukiwać sobie obiekty dla których podana data X mieści się w przedziale Y-Z wyznaczonym poprzez cennik.

Cennik: room_price(room_id, day_from, month_from, year_from, day_to, month_to, year_to, price, id). Jak widać jeden pokój może mieć zdefiniowanych wiele przedziałów cenowych (cenników).

User w formularzu rezerwacji podaje sobie powiedzmy date przyjazdu. Chcialbym teraz w MySQLu sprawdzić czy ta data znajduje się w którymś ze zdefiniowanych przedziałów cenowych? Jak to zrobić na poziomie SQL? Jakieś pomysły?

Przykładowo:
User podaje datę 24-12-2008.
Pokoj nr1 ma cennik 20-12-2008 do 30-12-2008 = 300euro
Pokoj nr2 ma cennik 1-12-2008 do 19-12-2008 = 400euro

Zapytanie powinno więc wskazać TYLKO pokój nr1.


Pozdrawiam,
parzol.
nevt
  1. SELECT * FROM room_price WHERE 'tu wstaw date usera w formacie Y-M-D' BETWEEN CONCAT_WS('-', `year_from`, `month_from`, `day_from`) AND CONCAT_WS('-', `year_to`, `month_to`, `day_to`);
parzol
Po dłuższym zastanowieniu to chyba nie działa to dobrze, bo wychodzą mi dziwne wyniki smile.gif

Zresztą jak tak pomyśleć to na logike nie powinno działać, bo jak mogę porównywać stringi? Musiałbym te daty wszystkie pozamieniać na np znaczniki czasu Unixowego jak na poziomie PHP się robi. Można tak zrobić w MySQL?
nevt
dziwne wyniki mogą wychodzić jeżeli pola year_from i year_to są dwu- a nie czterocyfrowe... lub użytkownik wprowadza 2 cyfrowy rok...
  1. SELECT * FROM room_price WHERE unix_time_format BETWEEN (10000*`year_from`+100*`month_from`+`day_from`) AND (10000*`year_to`+100*`month_to`+`day_to`);

powodzenia.
parzol
No już wogóle nie działa co napisałeś. Rok zawsze jest w formacie 4-liczbowym.

Aktualnie mam takie coś:

  1. SELECT r.id AS room_id FROM room r LEFT JOIN property p ON r.property_id=p.id LEFT JOIN city c ON p.city_id=c.id LEFT JOIN region re ON p.region_id=re.id LEFT JOIN room_gallery rg ON rg.room_id=r.id LEFT JOIN property_attraction pa ON pa.property_id=p.id LEFT JOIN attraction a ON a.id=pa.attraction_id AND (a.is_active=1 OR a.is_active IS NULL) LEFT JOIN room_price rp ON rp.room_id=r.id LEFT JOIN room_type rt ON rt.room_id=r.id LEFT JOIN type t ON rt.type_id=t.id AND (t.is_active=1 OR t.is_active IS NULL) LEFT JOIN room_reservation rr ON rr.room_id=r.id WHERE '1231542000' BETWEEN UNIX_TIMESTAMP(CONCAT_WS('-', rp.year_from, rp.month_from, rp.day_from)) AND UNIX_TIMESTAMP(CONCAT_WS('-', rp.year_to, rp.month_to, rp.day_to)) AND ('1231542000' < UNIX_TIMESTAMP(rr.reservation_from) OR '1231542000' > UNIX_TIMESTAMP(rr.reservation_to)) AND '1232146800' BETWEEN UNIX_TIMESTAMP(CONCAT_WS('-', rp.year_from, rp.month_from, rp.day_from)) AND UNIX_TIMESTAMP(CONCAT_WS('-', rp.year_to, rp.month_to, rp.day_to)) AND ('1232146800' < UNIX_TIMESTAMP(rr.reservation_from) OR '1232146800' > UNIX_TIMESTAMP(rr.reservation_to)) GROUP BY r.id ORDER BY p.is_promoted DESC LIMIT 0, 51;


Ale podaje mi złe wyniki sciana.gif Może ktoś wpadnie na jakiś pomysł albo zauważy błąd. Z góry dzięki!

UPDATE:
Właśnie zauważyłem że problem leży w tym że jesli mamy kilka rezerwacji to on sprawdza w petli i bierze pod uwage ostatni przedział. Jak zrobić żeby sprawdził wszystkie przedzialy a jesli tylko raz wystapi wartosc w przedziale to juz nie zwraca nam obiektu (a nie tylko patrzy na ostatni przedzial)?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.