Átlagos időpont time adattípusra
A mai napi agymenés 😁 Szüksége volt valakinek egy átlagszámításra... igen ám de time adattípusra. Az SQL Server nem igazán enged erre átlagot számolni, így meg kellett írni. A time típust nem igazán lehet konvertálni se float se int típusra - amik már használhatóak lennének az AVG függvénynek, így ez még egy kicsit bonyolítja a helyzetet, de 1 percnyi gondolkodás után 2 megoldásom is született:
1USE tempdb;
2GO
3
4CREATE TABLE test
5(
6 EmployeeID int,
7 Arrival time
8);
9GO
10
11INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:15');
12INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:20');
13INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:40');
14INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:00');
15INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:00');
16
17INSERT INTO test (EmployeeID, Arrival) VALUES (2, '22:33');
18INSERT INTO test (EmployeeID, Arrival) VALUES (2, '11:41');
19INSERT INTO test (EmployeeID, Arrival) VALUES (2, '08:40');
20INSERT INTO test (EmployeeID, Arrival) VALUES (2, '17:20');
21INSERT INTO test (EmployeeID, Arrival) VALUES (2, '12:51');
22GO
23--solution 1
24SELECT
25 EmployeeID,
26 CAST(DATEADD(ss, -AVG(DATEDIFF(ss,Arrival, '23:59:59')), '23:59:59') AS time)
27FROM
28 test
29GROUP BY
30 EmployeeID;
31--solution 2
32SELECT
33 EmployeeID,
34 CAST(CAST(AVG(CAST(CAST(Arrival as datetime) as float)) AS datetime) AS time)
35FROM
36 test
37GROUP BY
38 EmployeeID;
A második esetben érdemes a FLOOR függvényt is használni, mert előfordulhat, hogy több tizedesre fogja a datetime típust konvertálni. A kód úgy néz ki ahogy, sajnos. Kicsit "megerőszakolása" a time adattípusnak a dolog, de másként nem nagyon lehet ez megoldani. Bár ha valakinek van jobb megoldása, szívesen veszem.