web-dev-qa-db-fra.com

T-SQL calculant le temps moyen

J'ai un problème avec le calcul du temps moyen. C'est le cas: J'ai plusieurs lignes, dans chaque ligne il y a des données au format heure Donc je dois calculer une moyenne temps de toutes les lignes et multipliez-le avec le nombre de lignes mais bien sûr, j'ai un problème avec le format de données car je dois multiplier le temps avec un entier

Quelqu'un peut-il m'aider avec quelques conseils? Thnx Voici quelques données:

times
00:00:00.7400000
00:00:01.1870000
00:00:00.6430000
00:00:00.6100000
00:00:12.9570000
00:00:01.1000000
00:00:00.7400000
00:00:00.5300000
00:00:00.6330000
00:00:01.6000000
00:00:02.6200000
00:00:01.0300000
00:00:01.9630000
00:00:00.9800000
00:00:01.0170000
00:00:00.7600000
00:00:00.7130000
00:00:00.9730000
00:00:01.0000000
00:00:01.0530000
00:00:02.9400000
00:00:00.8200000
00:00:00.8400000
00:00:01.1800000
00:01:25.8230000
00:00:01.0000000
00:00:00.9700000
00:00:01.2930000
00:00:01.3270000
00:00:13.5570000
00:00:19.3170000
00:00:58.2730000
00:00:01.6870000
00:00:18.7570000
00:00:42.8570000
00:01:12.3770000
00:00:01.2170000
00:00:09.9470000
00:00:01.4730000
00:00:00.9030000
00:00:01.0070000
00:00:01.1100000
00:00:01.6270000
00:00:05.0570000
00:00:00.6570000
00:00:00.7900000
00:00:03.2930000
00:00:00.8600000
00:00:01.0330000
00:00:00.9300000
00:00:00.8730000
00:00:00.9600000
00:00:00.8070000
NULL

donc à partir de ces données un besoin en temps moyen ou/et la somme de ces données

12
user2158645

Vous devriez pouvoir utiliser quelque chose de similaire au suivant:

select 
  cast(cast(avg(cast(CAST(times as datetime) as float)) as datetime) as time) AvgTime,
  cast(cast(sum(cast(CAST(times as datetime) as float)) as datetime) as time) TotalTime
from yourtable;

Voir SQL Fiddle avec Demo .

Ceci convertit les données times en une datetime, puis une float afin que vous puissiez obtenir la avg/sum, puis vous reconvertissez la valeur en une datetime et enfin une time

11
Taryn

Vous pouvez faire cela en faisant un tas d’arithmétique de date:

DECLARE @t TABLE(x TIME);

INSERT @t VALUES('00:01:30'),('00:02:25'),('00:03:25');

SELECT CONVERT(TIME, DATEADD(SECOND, AVG(DATEDIFF(SECOND, 0, x)), 0)) FROM @t;

Cependant, ce que vous devriez faites ne pas utiliser TIME pour stocker un intervalle/une durée. TIME est destiné à stocker un point dans le temps (et tombe en panne si vous devez stocker plus de 24 heures, par exemple). Au lieu de cela, vous devriez stocker les heures de début et de fin d'un événement. Vous pouvez toujours calculer la durée (et la durée moyenne) si vous avez les deux points finaux.

11
Aaron Bertrand

En supposant que vous ayez stocké la durée dans un champ de temps, vous pouvez essayer la fonction Datediff comme ci-dessous pour obtenir la somme des durées (ou du temps total). Utilisez simplement Avg pour la moyenne.

Démo: http://sqlfiddle.com/#!3/f8c09/2

select sum(datediff(millisecond,0,mytime)) TotalTime
from t
0
Kaf

Cela peut être utile dans ce cas et dans des scénarios similaires. 

Ci-dessous convertira la date/heure en un nombre de minutes à partir de minuit. En d'autres termes, le temps est exprimé sous forme d'entier. Vous pouvez faire une moyenne sur cela et ensuite convertir en temps. 

declare @dt datetime = GETDATE();
select DATEDIFF(minute, dateadd(dd, datediff(dd, 0, @dt), 0), @dt);
--DATEDIFF(minute, [date without time i.e. midnight], [date/time of interest])
0
user2758686