2012-08-03 3 views
7

Wie kann ich avg (Zeit (4)) in der folgenden Abfrage:Operand Datentyp Uhrzeit ist ungültig für avg operator ...?

select top 10 avg(e.Duration) from TimeTable e 

ich die folgende Fehlermeldung erhalten:

Operand data type time is invalid for avg operator.

Dauer ist die Zeit (4) wie Typ:

Duration 
------------- 
00:00:10.0000 
+0

TIME repräsentiert einen Punkt in der Zeit. Wenn Sie versuchen, eine Dauer zu speichern, speichern Sie sie als Ganzzahl. –

+0

@AaronBertrand: Hi, ich kann es nicht als int speichern ... es ist nicht meine Datenbank. – JaJ

+0

Dann müssen Sie jedes Mal eine Konvertierung oder andere Datumsoperationen ausführen. Sie sollten dem Datenbankbesitzer mitteilen, dass er einen hohen Preis bezahlt, um eine Dauer in einem schönen Format zu speichern. –

Antwort

11

Sie können DateDiff(ms, '00:00:00', e.Duration) verwenden, um die Zeit in eine ganze Zahl von Millisekunden zu konvertieren. Verwenden Sie das für Ihr Aggregat und konvertieren Sie das Ergebnis dann zurück, z. Cast(DateAdd(ms, 1234, '00:00:00') as Time).

+0

Was ist 'ms' hier? – xameeramir

+1

In der [Dokumentation] (https://msdn.microsoft.com/en-us/library/ms189794.aspx?ppud=4) wird angezeigt, dass der Unterschied zwischen Datum und Uhrzeit in Millisekunden angegeben werden soll. – HABO

1

Nun scheint es time ist ein ungültiger Typ für die avg() Methode. Eine Liste der gültigen Datentypen finden Sie unter here.

Auch scheint es, als ob Sie eine Gruppe von Werten für diese benötigen, die die Notwendigkeit für top 10 mit Ihrer aktuellen Abfrage negieren würde.

7

Verbesserung aus der HABO Antwort:

select top 10 
Cast(DateAdd(ms,avg(DateDiff(ms, '00:00:00', e.Duration)), '00:00:00') as time) as 'avg duration' 
from TimeTable e 
Verwandte Themen