MY SQL OR problem [RIJESENO]

Imam 2 tabele. Jedna sadrzi id, id korisnika, datum, start_time, end_time i namjenjena je za pamcenje pauza radnika. Druga je slicna samo sto pamti radno vrijeme radnika. Npr u prvoj mogu imati unos tipa: 1, 1, 2013-02-05, 480, 490. Gdje je 480, kad se podjeli sa 60, 8 sati ujutro, a 490 predstavlja 8:10 minuta ujutro. Npr. neko je otisao na pauzu da ispusi cigarau i ostao 10 minuta. Pauza moze biti vise. Druga tabela moze imati unos npr. : 1, 1, xyz, 2013-02-05, 490, 660, gdje je xyz ime nekog posla koji je radio a 490 znaci da je poceo raditi u 8:10 i radio do 11 sati (660). Dakle, vrijeme se pamti u minutama.

Ono sto trebam napraviti je da se ne dozvoli preklapanje vremena. Npr. u gornjem slucaju radnik ne moze unjeti pocetak radnog vremena 8, jer je do 8:10 bio na pauzi. Isto tako ne moze unjeti da je poceo raditi neki posao2 u 10:30 jer je radio posao1 do 11:00 sati. Kako sam ovo rijesio? Imam dva polja za unos: start_time i end_time. Prodjem kroz navedene tabele da vidim da li ijedan posao ili pauza sa danasnjim datumom ima end_time veci od start_time-a koji upravo unosim. Ukoliko je tako javim gresku a ako nije dozvolim unos. Medjutim ovo i ne radi bas tako. Moj upit je tipa:

SELECT COUNT(*) FROM zeiterfassung, breaks WHERE zeiterfassung.end_time > $start_time OR breaks.end_time > $start_time AND zeiterfassung.datum = ‘$datum’…itd.

ako je count 0 dozvoli unos a ako nije javi gresku. Medjutim ovo mi uvijek vrati gresku. Kontam da je neki problem sa OR.

Jos veci je problem kad se unese nekoliko stavki (pauza i radnih sati), pa se zatim neka od njih obrise (i to je dozvoljeno), tada dobijem “rupu” u vremenu koji je ta stavka zauzimala. Kako da pri unosu nadjem i takvo nesto pa dozvolim da se ta rupa “popuni”? Npr. radio sam nesto od 11 do 13 i onda to obrisao. Treba da od 11 do 13 mogu ponovo unjeti neki posao. Problem je sto ja imam neki unos od 13 do 16 (kraj ranog vremena) i moj kod vidi da je zadnji end_time 16 i ne dozvoljava unos prije njega.

Uf…nadam se da cete skontati sta sam htjeo reci :smiley:

Napamet: http://www.w3schools.com/sql/sql_having.asp

Hm…nije lose za razmisliti…ali kako mi to moze pomoci u konkretnom problemu. Mozel neki SQL statment, onako ovrlje, ne mora citav?

Pa, radi count po koloni koja će ti se pojavljivati u HAVING uslovu.

BTW zašto ne koristiš TIME polje za taj start_time i end_time?

Pa ne mislim da treba. Dovoljno je INT koji predstavlja minute. Sekunde mi ne trebaju. Jel mislis da bih trebao?

Kad imas TIME polje mozes raditi stvari tipa datum1 < datum2 u queryju da provjeris jel se datum1 desio prije datum2, a mozes dobit unix timestamp sto u mysqlu (UNIX_TIMESTAMP(datum1)) sto u phpu (strtotime($datum1)).

Ostace ipak INT polje za vrijeme a i nije to tako vazno. Sto se tice onih preklapanja vremena sto sam pisao ovo mi predlaze sef (navodno bi rijesilo sva ta preklapanja):

$overlay = db_result(db_query("SELECT COUNT(*) FROM zeiterfassung, breaks WHERE ((zeiterfassung.start_zeit < $start_zeit AND zeiterfassung.end_zeit > $start_zeit) OR
	                                (zeiterfassung.start_zeit < $end_zeit AND zeiterfassung.end_zeit > $end_zeit) OR (breaks.start_zeit < $start_zeit AND breaks.end_zeit > $start_zeit) OR
	                                (breaks.start_zeit < $end_zeit AND breaks.end_zeit > $end_zeit) AND zeiterfassung.datum = '$tag' AND zeiterfassung.uid = '$uid')"));

i ako je overlay nula dozvoli pisanje a ako nije ne dozvoli.

Medjutim ovdje je overlaj uvijek != 0.

Takodje mi je rakao da je to ok kod, samo ga malo treba popraviti. Ja ne kontam sta. Eto mozda vi vidite nesto sto ja ne vidim.

Da sam sebi odgovorim: kod sada izgleda ovako:

$overlay = db_result(db_query("SELECT COUNT(*) FROM zeiterfassung, breaks WHERE ((zeiterfassung.start_zeit < $start_zeit AND zeiterfassung.end_zeit > $start_zeit) OR
	(zeiterfassung.start_zeit < $end_zeit AND zeiterfassung.end_zeit >= $end_zeit) OR (breaks.start_zeit < $start_zeit AND breaks.end_zeit > $start_zeit) OR
	(breaks.start_zeit < $end_zeit AND breaks.end_zeit > $end_zeit)) AND (zeiterfassung.datum = '$tag' AND zeiterfassung.uid = '$uid')"));

Posto su ostali zauzeti raspravom po trugim temama, ako nekog zanima naci ce sta je u ovom kodu zamjenjno, tako da sad radi kako sam ocekivao.