webForumDet fria alternativet

Räkna tid

2 svar · 506 visningar · startad av oskars

oskarsMedlem sedan nov. 20051 317 inlägg
#1

Tjenare!

Jag har en tabell som ser ut så här:

ID / User / Datum / Start / Slut

1 | Oskar | 2009-10-01 | 19:00:00 | 19:10:00
2 | Oskar | 2009-10-01 | 19:23:00 | 19:30:00
3 | Oskar | 2009-10-01 | 19:33:00 | 19:40:00

Jag vill med en SQL-sats räkna ihop alla "mellanrum" mellan SLUT i första, och START i andra, och sen mellan andra och tredje, osv. Och sen göra så för alla rader som finns för det datum man angiver.

I det här fallet skulle resultatet bli 16min t.ex..

Vettesjuttsingen hur jag ska lösa det med en smidig SQL-query tyvärr. Kanske ni har någon bra idé?

Tacksam för hjälp!

prebenMedlem sedan mars 2009452 inlägg
#2

Klurigt. Man måste tänka lite för att förstå frågan!

Även om det i teorin skulle kunna gå att lösa i SQL undrar jag om jag inte hade gjort själva uträkningen i skriptspråket, vilket i mitt fall i klassisk ASP.

Kanske inte smidigare, men jag skulle fatta vad koden gör. Datorer idag (servrar) är sjukt snabba så då finns det liksom ingen vits med att skriva kort kod, om ända vinsten är att koden är just kort! Du ska ju förstå din kod i framtiden också...

För jag antar att ovanstående är bara ett exempel och att det i ditt fall är mer komplicerat och med många fler användare. (Kolla om du inte kan ha userID i stället för namnet. Det kan finnas flera Oscar, men bara en användare med userID 34.)

***
Detta var kanske inte direkt ett svar på din fråga, men kanske en lösning på ditt problem!

adde2Medlem sedan maj 2000144 inlägg
#3

Följande funkar i SQL server 2008, borde funka i 2005 också (med undantag för datatyperna date och time, egentligen kanske du borde fundera på om inte start och slut ska vara datetime istället så funkar scriptet bättre om det är flera datum inblandade mellan start och slut, exempelvis start = 2009-10-01 23:50:00 och slut = 2009-10-02 01:00:00'. scriptet nedan kommer att räkna fel i det scenariot.

create table tid(id int identity, namn varchar(10), datum date, start time, slut time);

insert into tid (namn, datum, start, slut) values
('oskar', '2009-10-01', '19:00:00', '19:10:00'),
('oskar', '2009-10-01', '19:23:00', '19:30:00'),
('oskar', '2009-10-01', '19:33:00', '19:40:00'),
('håkan', '2009-10-01', '19:00:00', '19:15:00'),
('håkan', '2009-10-01', '19:27:00', '19:48:00'),
('håkan', '2009-10-01', '19:50:00', '20:40:00'),
('nisse', '2009-10-01', '20:00:00', '23:59:59'),
('nisse', '2009-10-02', '00:00:05', '10:00:00'); 

select namn, SUM(diff) diff from (
select t.namn, datediff(mi, cast(t.datum as datetime)+ cast(t.slut as datetime) - '1900-01-01', t3.start) as diff from tid t
outer apply (select MIN(id) id from tid t2 where t.id < t2.id and t2.namn = t.namn) t2	
outer apply (select cast(t3.datum as datetime) + cast(t3.start as datetime) - '1900-01-01' as start from tid t3 where t3.id = t2.id) t3
) x group by namn;

namn diff
---------- -----------
håkan 14
nisse 1
oskar 16

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)