Wyszukiwanie wolnego terminu w MySQL


(northwest) #1

Witam serdecznie,

Mam następującą tabelkę zawierającą rekordy z zajętymi terminami pojazdów:

CREATE TABLE IF NOT EXISTS `cms_users_polaczenia_lotow` (
  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(160) COLLATE utf8_unicode_ci DEFAULT NULL,
  `idpojazdu` int(11) NOT NULL,
  `datastart` date DEFAULT NULL,
  `datacel` date DEFAULT NULL,
  `godzinastart` time DEFAULT NULL,
  `godzinacel` time DEFAULT NULL,
  UNIQUE KEY `id` (`bf_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

 

datastart = oznacza datę wyjazdu

datacel =oznacza datę dotarcia do celu

godzinastart = oznacza godzinę wyjazdu

godzinacel =oznacza godzinę dotarcia do celu

 

 

Potrzebuję zapytanie które:

a) sprawdzi czy dany pojazd jest zajęty w wyszukiwanym terminie (jeśli istnieje rekord o konkretnej godzinie i dacie = pojazd zajęty)

b) jeśli jest wolny - to wyświetli wolne terminy w formacie: 1:00, 1:05, 1:10, 1:15 itp (od 1 do 24 z wyłączeniem zajętych terminów).

 

Wie ktoś może jak to zrobić?

 

Bardzo proszę o pomoc,

Northwest

 


(Pablo_Wawa) #2

A możesz powiedzieć, dlaczego zdecydowałeś się rozdzielić czas wyjazdu i dotarcia do cela na datę i godzinę, zamiast trzymać to razem (co chyba by ułatwiło potem operowanie na przedziałach czasowych w MySQL?

No i wyjaśnij, co dla Ciebie oznacza pojęcie “termin” (“w wyszukiwanym terminie”)? Czy to jest przedział czasowy (<początek;koniec>), czy konkretna data i czas (z gradacją 5 minut - tak zasugerowałeś w pytaniu)?

 

http://blog.kowalczyk.cc/2011/08/02/sql-znajdowanie-rekordow-w-przedziale-czasu/


(Sido Cod) #3

Pierwsze pytanie dlaczego datę i godzinę rozbiłes na dwa pola, a nie wykorzystałeś jednego pola typu DATETIME?

Strasznie przez to utrudniłeś sobie pracę…

Na dodatek jak już przechowujesz samą datę, to też jest do tego pola odpowiedni typ DATE, który natywnie wspiera mysql i łatwo można operować zapytaniami do bazy operając się właśnie o te typy. Naucz się wykorzystywać mechanizmy wbudowane w mysql… bo przecież od tego są.


(northwest) #4

Witajcie,

dziękuję za odpowiedź :slight_smile:

Zrobiłem te 2 pola w formacie datatime.

 

ale coś nie do końca to działa :frowning:

 

mam zapytanie:

select id from polaczenia WHERE datastart <='2014-07-30 15:15:00' and datacel >='2014-07-30 17:15:59' ;

 

i rekord w bazie z połączeniem: datastart = 2014-07-30 14:55:00 oraz datacel = 2014-07-30 15:15:00

Zapytanie mi nie zwraca rekordu…

 

Potrzebuję zapytanie które sprawdzi mi, czy nie istnieją zajęte terminy w wybranym przedziale czasowym…


(kostek135) #5

Nie zwraca ci go ponieważ: 2014-07-30 14:55:00 <= 2014-07-30 15:15:00 jest true, natomiast 2014-07-30 15:15:00 >= 2014-07-30 17:15:59 zwróci fałsz. Koniunkcja prawdy i fałszu daje fałsz, zatem rekord nie załapie się do zwracanych wyników.


(Pablo_Wawa) #6

Czyli albo

select id from polaczenia WHERE datastart >='2014-07-30 15:15:00' and datacel <='2014-07-30 17:15:59' ;

albo

select id from polaczenia WHERE datastart <='2014-07-30 15:15:00' OR datacel >='2014-07-30 17:15:59' ;

(kostek135) #7

 


(Pablo_Wawa) #8

Przepraszam, nie doczytałem szczegółów problemu i tak na szybko “wrzuciłem” poradę, nic nie wnoszącą jednak to rozwiązania zagadnienia.