/ Vypočítajte celkové hodiny za deň - sql-server

Vypočítajte celkový počet hodín za deň - sql-server

Pracujem na správe a chcem ju zobraziťcelkový čas zamestnanec strávil v kancelárii každý deň. Zamestnanec robí z kancelárie niekoľkokrát, takže pri každom uložení údajov. Mám takú tabuľku a záznamy.

CREATE TABLE Attendance
(
ID Int,
TimeIn datetime,
TimeOut datetime
);


INSERT INTO Attendance VALUES (1, "2018-01-18 09:37:25.000", "2018-01-18 11:12:25.000");
INSERT INTO Attendance VALUES (1, "2018-01-18 11:21:25.000", "2018-01-18 16:32:25.000");
INSERT INTO Attendance VALUES (1, "2018-01-18 16:37:25.000", "2018-01-18 17:55:25.000");
INSERT INTO Attendance VALUES (2, "2018-01-18 09:56:25.000", "2018-01-18 14:37:25.000");
INSERT INTO Attendance VALUES (2, "2018-01-18 15:00:25.000", "2018-01-18 18:27:25.000");
INSERT INTO Attendance VALUES (1, "2018-01-19 09:12:25.000", "2018-01-19 11:41:25.000");
INSERT INTO Attendance VALUES (1, "2018-01-19 13:23:25.000", "2018-01-19 13:31:25.000");
INSERT INTO Attendance VALUES (2, "2018-01-19 09:12:25.000", "2018-01-19 09:59:25.000");
INSERT INTO Attendance VALUES (2, "2018-01-19 12:55:25.000", "2018-01-19 13:12:25.000");
INSERT INTO Attendance VALUES (2, "2018-01-19 14:01:25.000", "2018-01-19 18:10:25.000");
INSERT INTO Attendance VALUES (1, "2018-01-19 17:31:25.000", "2018-01-19 18:51:25.000");

Chcem, aby sa výsledok zobrazil takto.

ID  TimeIn TimeOut TimeIn TimeOut TimeIn TimeOut  TimeSpent          Day
1                                                 Calculated Hours   2018-01-18
2                                                 Calculated Hours   2018-01-18
1                                                 Calculated Hours   2018-01-19
2                                                 Calculated Hours   2018-01-19

A ak je to možné, môžeme časovo aj časovo zobraziť aj dynamicky?

odpovede:

1 pre odpoveď č. 1

Nájdite zamestnanca s maximálnym počtom vstupov / výstupov za jeden deň. A zmeniť počet stĺpcov v dopyte podľa toho

select
id, day, TimeIn = max(iif(rn = 1, TimeIn, "")), TimeOut = max(iif(rn = 1, TimeOut, ""))
, TimeIn = max(iif(rn = 2, TimeIn, "")), TimeOut = max(iif(rn = 2, TimeOut, ""))
, TimeIn = max(iif(rn = 3, TimeIn, "")), TimeOut = max(iif(rn = 3, TimeOut, ""))
, TimeIn = max(iif(rn = 4, TimeIn, "")), TimeOut = max(iif(rn = 4, TimeOut, ""))
, TimeIn = max(iif(rn = 5, TimeIn, "")), TimeOut = max(iif(rn = 5, TimeOut, ""))
, TimeSpent = concat(right(concat("0",sum(TimeSpent) / 60),2), ":", right(concat("0",sum(TimeSpent)%60),2))
, Day
from (
select
id, cast(TimeIn as date) day, TimeIn = convert(char(8), TimeIn, 108)
, TimeOut = convert(char(8), TimeOut, 108)
, datediff(mi, TimeIn, TimeOut) TimeSpent
, row_number() over (partition by id, cast(TimeIn as date) order by TimeIn) rn
from
@Attendance
) t
group by id, day

1 pre odpoveď č. 2

Samotné zoskupenie sa môže uskutočniť s bežnou skupinou, ale snáď sa to dá zbaliť zoskupením dňa? Ak áno, klauzula skupiny môže mať rovnaké obsadenie / konverzie použité na displeji:

SELECT ID, sum(DATEDIFF(MINUTE, TimeIn,TimeOut)) TotalMinutes,CAST(TimeIn as date)  Day
FROM Attendance
group by ID, CAST(TimeIn as date)

Následne sa dá formátovanie času uskutočniť pomocou

select ID, format(TotalMinutes / 60, "0") + ":" + format(TotalMinutes % 60, "00"), Day
from(
SELECT ID, sum(DATEDIFF(MINUTE, TimeIn,TimeOut)) TotalMinutes,CAST(TimeIn as date)  Day
FROM @Attendance
group by ID, CAST(TimeIn as date)
) a

Neboli ešte vidieť informácie o dynamických stĺpcoch. Skúsime sa do toho pozrieť neskôr


editovať Možnosť pre vstupné / výstupné stĺpce:

;with a as
(
select *, cast(TimeIn as date) Day ,
format(dateadd(MINUTE, sum( DATEDIFF( MINUTE , TimeIn,TimeOut)) over (partition by ID,cast(TimeIn as date)),0),"H:mm")  TimeSpent,
cast(row_number() over (partition by ID, cast(TimeIn as date) order by TimeIn) as varchar) rnr
from Attendance
)
select * from
(select ID, Day, TimeSpent, "In" + rnr Name, FORMAT(TimeIn, "H:mm") T from a
union all
select ID, Day, TimeSpent,"Out" +rnr, FORMAT(TimeOut, "H:mm") from a) u
pivot(min(T) for Name in ([In1], [Out1], [In2], [Out2],[In3],[Out3], [In4], [Out4])) p --as much as desired

Sql Fiddle