Różnica w czasie SQL

0

Witam, mam w tabeli 3 kolumny (pracownik, data_godzina, czynność)
Jak najszybszym i najprostszym zapytaniem sql mogę obliczyć czas trwania każdej czynności.
Dodam, że data_godzina (format datetime) to czas rozpoczęcia danej czynności i trwa ona do czasu rozpoczęcia następnej.
Chciałbym, żeby zapytanie rozróżniało pracowników.

Z góry dziękuję za pomoc.

0

Dla każdego rekordu użyć funkcji do obliczania różnicy czasu.

2

Jeśli silnik wspiera funkcje analityczne, to może. LAG/LEAD?

select 
  czynnosc, 
  lead(data_godzina) over (partition by pracownik order by data_godzina) koniecCzynnosci
  data_godzina pocztekCzynnosci
from tabelka; 

LEAD zwraca wartość atrybutu z "następnego wiersza" w result secie (bądź jakieś podgrupie rekordów: partition by pracownik -> podgrupa czynnosci pracownika, order by - uporzadkowana po data_godina)

Zauważ, że lead() może zwrócić NULL w przypadku braku ostatniego rekordu (czynnoość nie zakończyłą się), więc trzeba to sobie obsłużyć jakoś, np. casem, podzapytaniem czy jakoś inaczej.

Poniżej wersja, której nie testowałem, ale ma teoretyczny potencjał :P

select 
  czynnosc, 
  coalesce( to_char(lead(data_godzina) over (partition by pracownik order by data_godzina) - data_godzina), 'CZYNNOSC NIE ZAKONCZYLA SIE') czas_trwania
from tabelka; 
0

Niestety nie wspiera, a funkcja wyglądała bardzo obiecująco.

0

Select pracownik, czynnosc, data_godzina, (select min(data_godzina) from tabela x where x.pracownik=t.pracownik And x.czynnosc=t.czynnosc and x.data_godzina>t.data_godzina) from tabela t

0

Dodałem w tabeli 4 kolumnę i chciałbym zrobić do niej UPDATE używając powyższej funkcji LEAD. Jak powinien wyglądać zapis ?

update tabelka SET kolumna_4 = lead(data_godzina) over (partition by pracownik order by data_godzina) - data_godzina
where kolumna 4 is null

Gdzie tu może być błąd ?

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