Átlagos időpont time adattípusra

A mai napi agymenés Smile 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:

USE tempdb;
GO

CREATE TABLE test
(
	EmployeeID int,
	Arrival time
);
GO

INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:15');
INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:20');
INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:40');
INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:00');
INSERT INTO test (EmployeeID, Arrival) VALUES (1, '11:00');

INSERT INTO test (EmployeeID, Arrival) VALUES (2, '22:33');
INSERT INTO test (EmployeeID, Arrival) VALUES (2, '11:41');
INSERT INTO test (EmployeeID, Arrival) VALUES (2, '08:40');
INSERT INTO test (EmployeeID, Arrival) VALUES (2, '17:20');
INSERT INTO test (EmployeeID, Arrival) VALUES (2, '12:51');
GO
--solution 1
SELECT
	EmployeeID,
	CAST(DATEADD(ss, -AVG(DATEDIFF(ss,Arrival, '23:59:59')), '23:59:59') AS time)
FROM
	test
GROUP BY
	EmployeeID;
--solution 2
SELECT
	EmployeeID,
	CAST(CAST(AVG(CAST(CAST(Arrival as datetime) as float)) AS datetime) AS time)
FROM
	test
GROUP BY
	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.

Add comment