Cześć, kombinuję, kombinuję, ale nie za bardzo mi wychodzi.
Najlepiej to wyjaśnić na przykładzie, o co mi chodzi. Mam tabelę:
ID | IN | OUT |
------------------------------------------------------
1 | 2009-01-01 17:00 | 2009-01-02 09:00 |
2 | 2009-01-01 16:50 | 2009-01-02 08:30 |
3 | 2009-01-01 17:00 | 2009-01-02 00:10 |
I teraz tak. To są godziny wejścia i wyjścia.
Ja muszę policzyć, ile czasu kolo był w nocy, gdzie noc umownie definiujemy godzinami: 21 - 7
Moje zapytanie wygląda tak(zakładamy, że w tabeli jest tylko praca nocna):
select ID, IN, OUT, datediff(ss, firstIn, lastOut) - datediff(ss, dbo.get_time(firstIn), '21:00:00') - datediff(ss, '07:00:00', dbo.get_time(lastOut)) as nightWorkTime
from tabela
Co ja robię. Ano liczę sobie różnicę między OUT i IN, następnie odejmuję różnicę między IN i godziną 21, a na koniec odejmuję różnicę między godziną 7 i OUT.
Czyli teoretycznie powinno mi zostać tylko to, co mnie interesuje.
I prawie tak się dzieje. Tzn. tylko w jednym rekordzie dostaję źle. A mianowicie w rekordzie o ID 3. Dostaję tyle samo czasu, co w pozostałych rekordach, a powinienem dostać 3 godziny z hakiem.
Podejrzewam, że zrobiłem gdzieś jakiś idiotyczny błąd, ale nie wiem za bardzo gdzie i jaki.
[dopisane]
Chyba muszę rozpatrzyć 8 różnych przypadków w zagnieżdżonym case.
IN<21 i OUT>7
IN<21 i OUT<7
IN>21 i OUT>7
IN>21 i OUT<7
do tego dochodzi razy dwa, bo jeszcze ważne jest, czy out jest tego samego dnia co in, czy następnego.
Jeśli ktoś ma lepszy pomysł, a ja kombinuję jak koń pod górę, to proszę o pomoc :)