Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Porównywanie dat oraz okresów czasowych + złożone zapytanie MySQL
Forum PHP.pl > Forum > PHP
Riggs
Witam,
otóż piszę system wypożyczeń pewnego sprzętu i pojawił się problem przy tworzeniu rezerwacji dla danego sprzętu.
Użytkownik robiąc zamówienie (rezerwację) podaje datę rozpoczęcia oraz zakończenia zamówienia. Daty przechowuję w formacie timestamp (możliwa wymiana na inne ale wiąże się to z przebudową dużej części aplikacji). Kolejnym krokiem jest utworzenie na podstawie podanego czasu trwania zamówienia listy dostępnego sprzętu w tym czasie.
Najpierw daty:
- interesują mnie tylko dni, nie dokładne godziny. Czy ktoś odda sprzęt 09.10.2009 o 8 rano czy o 22 to nieistotne bo dostępny będzie on od 10.10.2009
- jest kilka przypadków które muszę rozpatrzyć:
+ data zamówienia zawiera się w innej dacie wypożyczenia sprzętu
+ data zamówienia obejmuje w całości datę innego wypożyczenia
+ data zamówienia jest "przecięta" przez moment rozpoczęcia lub zakończenia innego zamówienia.
Jak to sprawdzić? Chodzi o to żeby żaden przypadek nie zachodził (czyli sprzęt będzie dostępny w tym terminie).

Problem z MySQL.
1. Tabela sprzet: najważniejsze jest to że przechowuje ilość posiadanego sprzętu (ogólnie)
2. Tabela zamówienia: przechowuje czas trwania zamówienia - data start i koniec oraz jakieś pole INT wskazujące czy zamówienie jest zakończone (całość oddana) czy też nie)
3. Tabela zam_sprzet: id_zamowienia, id_sprzetu, ilość sztuk sprzętu w danym zamówieniu, tu też można dać pole typu INT czy cały sprzęt został zwrócony
4. Tabela zam_zwroty: id_zamownienia, id_sprzetu, ilość oddanych sztuk sprzętu danego typu (można zwracać partiami)

Zapytanie będzie dość skomplikowane dlatego proszę kogoś doświadczonego o pomoc (bo MySQL znam tylko podstawy):
Wydaje mi się że będzie trzeba pobrać całość danych z tabeli sprzęt (do wyświetlenia informacji o wypożyczanym typie sprzętu),
następnie dla każdego sprzętu trzeba sprawdzić czy są jakieś rekordy w tabeli zam_sprzet - jeżeli są to spawdzić w tabeli zam czas trwania istniejącego zamówienia (tu problem porównywania dat opisany wcześniej) i jeżeli się pokrywa z tym które składa użytkownik to pokazać dostępną ilość sprzętu odejmując od ilości bazowej ilość wypożczoną w innych zamówieniach oraz dodając ilość zwróconą.
To zapytanie jest jednak dla mnie zbyt skomplikowane i byłbym wdzięczny gdyby ktoś mi pomógł.
cojack
No problem to masz okropny, a szczerze powiedziawszy to żaden, jak masz tabele z sprzętem ogólnie, czyli jaki masz sprzęt na sklepie i masz tabele gdzie masz zamówienia to kurde nie rób intów na bool, ok? To po 1 (inty na bool, masz w int czy sprzęt jest dostępny czy nie, po cholerę, zrób to na boolean). Po drugie zapytanie do bazy danych będzie absurdalnie proste.

  1. SELECT * FROM tabela_calego_sprzetu WHERE id NOT IN (SELECT id FROM tabela_z_zamowionym_sprzetem)


Dziękuje.

A date to sobie najlepiej trzymać w unix epoch, zwykły int i święto lasu, szybciej sie po int sortuje niż po timestamp, chyba oczywiste, ale jak już masz ten timestamp mysqlowy to go już zostaw, nic się nie stanie.
Riggs
Trochę źle zrozumiałeś o co mi chodzi. Problem co prawda udało mi się rozwiązać i rozwiązanie wcale nie jest tak proste jak napisałeś (a zapytanie SQL ma kilka podzapytań aby sprawdzić co jest dostępne w danym okresie). Wydaje mi się że zrozumiałeś że wypożyczenie sprzętu oznacza "zablokowanie" rekordu z tabeli sprzęt (tak wynika z zapytania). A mi chodziło o ilość sprzętu (każdy sprzęt ma pole ilość i można wypożyczyć dowolną ilość). Ale mniejsza o to.
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.