Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] wyszukiwanie wg daty
parzol
post
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

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


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.
Go to the top of the page
+Quote Post
nevt
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


  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`);


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
parzol
post
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

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


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?

Ten post edytował parzol 3.09.2008, 18:48:24
Go to the top of the page
+Quote Post
nevt
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


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.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
parzol
post
Post #5





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

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


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)?

Ten post edytował parzol 3.09.2008, 22:34:50
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: 22.08.2025 - 05:28