[MSSQL] Policzenie czasu z części zakresu

0

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 :)

0

przyszło mi do głowy coś takiego

select least(out,trunc(out)||'0700') - greatest(in, trunc(in)||'2100' ) czas_pracy
from tabela

trzeba by jeszcze zamienić daty na godziny, minuty, sekundy (lub coś podobnego :D)

0

Odejmuj wartosci tylko jesli sa dodatnie. W 3 przypadku robisz 7 -4 -(-6 z hakiem). W przypadku krotszego czasu pracy (pozniej niz 21, wczesniej niz 7) roznica wyjdzie ujemna, a Ciebie wtedy ona nie interesuje.

0 użytkowników online, w tym zalogowanych: 0, gości: 0