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