wtorek, 4 września 2018

Pomiar czasu - algorytm cz1

Na razie coś ala przygotowanie do algorytmu.

Mam przygotowane dane na warsztat wziołem zawodnika który ma 15 czasów

2018-06-16 15:00:01.900
2018-06-16 16:32:33.543
2018-06-16 17:47:11.840
2018-06-16 19:30:12.890
2018-06-16 20:47:57.133
2018-06-16 22:44:20.530
2018-06-17 00:07:24.417
2018-06-17 02:06:05.140
2018-06-17 03:27:23.337
2018-06-17 05:23:25.930
2018-06-17 06:44:00.647
2018-06-17 08:40:28.020
2018-06-17 10:02:56.897
2018-06-17 11:51:48.810
2018-06-17 13:34:51.903

Tabela składa się z dwóch kolumn czas_id oraz czas_1 (czas_id PK int, czas_1 - datetime)
Na początek mógłbym sprawdzić czas całkowity czyli odjąć od ostatniego czasu pierwszy interesują mnie godziny, minuty, sekundy
Lubie używać CTE


with source as
(
select * from czas_OneColumn where czas_id = 240
)

select       
     DATEDIFF(HOUR, min(czas_1), max(czas_1)) as hh,
     DATEDIFF(MINUTE, min(czas_1), max(czas_1))%60 as mm,
     DATEDIFF(SECOND, min(czas_1), max(czas_1))%60 as ss
 from source

Czas przejazdu => 22:34:50 (jechał na 700 km)

Czemu dzielenie modulo? Potrzebuję ilości minut oraz sekund które nie są podzielne przez 60.
Później można by funkcje napisać, która zwraca różnicę w czasie (odcinek czasu) ale póki co taki zapis wystarczy.
Mam czas przejazdu  zawodnika teraz trzeba by było to rozbić na odcinki 100 kilometrowe, na odcinek 100 kilometrów składają się trzy odbicia. 
Dobra nie wytrzymałem
Funkcja może wyglądać tak, zwraca stringa



CREATE FUNCTION [dbo].[fTimeSegment]
(
       @czas1 datetime,
       @czas2 datetime
)
RETURNS varchar(8)
AS
BEGIN
       declare @wynik varchar(8)
       declare @hh int
       declare @mm int
       declare @ss int

       select 
             @hh = DATEDIFF(HOUR, @czas1, @czas2),
             @mm = DATEDIFF(MINUTE, @czas1, @czas2)%60,
             @ss = DATEDIFF(SECOND, @czas1,@czas2)%60

       select
             @wynik = cast(@hh as varchar)
             + ':' + cast(@mm as varchar)
             + ':' + cast(@ss as varchar)

       RETURN @wynik
END

Dla ułatwienia wyliczenia wyniku co 100 kilometrów można by pokusić się o wyliczanie odcinka czasu po trzecim odbiciu ale tylko w tedy jeżeli będę kontrolował zwłokę między odbiciami (dotychczas 30 minut).

Wywiłanie funkcji:
declare @wynik varchar(8);

with source as
(
select * from czas_OneColumn where czas_id = 240
)

 select @wynik = dbo.fTimeSegment(min(czas_1), max(czas_1))
 from source

 print @wynik


 


Brak komentarzy:

Prześlij komentarz

 Po wielu miesiącach przerwy Czteroletnim exodusie do bloga ismartdev, który zdechł w zeszłym roku w listopadzie, na powrót wstąpiłem w ten ...