mam problem z oznaczeniem zmian pracownika które są obok siebie (tych których data rozpoczęcia jest taka sama jak data zakończenia poprzedniej). Posiadam dwie tabele - zmiany z długością jej trwania oraz zmiany przypisane użytkownikowi wraz z datą i godziną rozpoczęcia.
Kod
mysql> describe shifts;
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| ID | int(10) | NO | PRI | NULL | auto_increment |
| DURATION | time | NO | | NULL | |
+----------+------------------+------+-----+---------+----------------+
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| ID | int(10) | NO | PRI | NULL | auto_increment |
| DURATION | time | NO | | NULL | |
+----------+------------------+------+-----+---------+----------------+
Kod
mysql> describe employees_shifts;
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| ID | int(10) | NO | PRI | NULL | auto_increment |
| SHIFT_ID | int(10) | NO | | NULL | |
| DATE | datetime | NO | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| ID | int(10) | NO | PRI | NULL | auto_increment |
| SHIFT_ID | int(10) | NO | | NULL | |
| DATE | datetime | NO | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
Dla lepszego zobrazowania przykład:
Kod
od 2012-02-20 15:00:00 do 2012-02-20 18:00:00
od 2012-02-22 10:00:00 do 2012-02-22 20:00:00 - data zakończenia tej zmiany jest taka sama jak data rozpoczęcia następnej zmiany
od 2012-02-22 20:00:00 do 2012-02-22 21:00:00 - data rozpoczęcia tej zmiany jest taka sama jak data zakończenia poprzedniej zmiany
od 2012-02-25 15:00:00 do 2012-02-25 18:00:00
od 2012-02-22 10:00:00 do 2012-02-22 20:00:00 - data zakończenia tej zmiany jest taka sama jak data rozpoczęcia następnej zmiany
od 2012-02-22 20:00:00 do 2012-02-22 21:00:00 - data rozpoczęcia tej zmiany jest taka sama jak data zakończenia poprzedniej zmiany
od 2012-02-25 15:00:00 do 2012-02-25 18:00:00
Chodzi o oznaczenie dwóch środkowych zmian. Oznaczenie pierwszej zmiany nie jest problem:
SELECT `ES`.`DATE` AS `ES_START_DATE`, -- Czas rozpoczęcia zmiany. ADDTIME( `ES`.`date`, `S`.`duration` ) AS `ES_END_DATE`, -- Czas zakończenia zmiany. `ES2`.`ID` AS `ES2_ID` -- Wartość inna niż NULL oznacza że data zakończenia tej zmiany jest taka sama jak data rozpoczęcia następnej. FROM `EMPLOYEES_SHIFTS` AS `ES` LEFT JOIN `SHIFTS` AS `S` ON( `ES`.`SHIFT_ID` = `S`.`ID` ) LEFT JOIN `EMPLOYEES_SHIFTS` AS `ES2` ON( ADDTIME( `ES`.`date`, `S`.`duration` ) = `ES2`.`DATE` )
Kod
+---------------------+---------------------+--------+
| ES_START_DATE | ES_END_DATE | ES2_ID |
+---------------------+---------------------+--------+
| 2012-02-20 15:00:00 | 2012-02-20 18:00:00 | NULL |
| 2012-02-22 10:00:00 | 2012-02-22 20:00:00 | 3 |
| 2012-02-22 20:00:00 | 2012-02-22 21:00:00 | NULL | <- Muszę oznaczyć jeszcze ten rekord.
| 2012-02-25 15:00:00 | 2012-02-25 18:00:00 | NULL |
+---------------------+---------------------+--------+
| ES_START_DATE | ES_END_DATE | ES2_ID |
+---------------------+---------------------+--------+
| 2012-02-20 15:00:00 | 2012-02-20 18:00:00 | NULL |
| 2012-02-22 10:00:00 | 2012-02-22 20:00:00 | 3 |
| 2012-02-22 20:00:00 | 2012-02-22 21:00:00 | NULL | <- Muszę oznaczyć jeszcze ten rekord.
| 2012-02-25 15:00:00 | 2012-02-25 18:00:00 | NULL |
+---------------------+---------------------+--------+
Problem pojawia się przy próbie oznaczenia zmiany której data rozpoczęcia jest taka sama jak data zakończenia poprzedniej. Spowodowane jest to brakiem możliwości obliczenia daty zakończenia zmiany w łączonej tabeli. Mi nic konkretnego do głowy nie przychodzi.
Strukturę tabel oraz przykładowe dane można pobrać tutaj.
PS. Przepraszam za tytuł, ale kompletnie nie mam pomysłu .