2016-07-13 6 views
0

Ich verwende SQL Server 2008R2, ich habe eine Tabelle mit dem Namen Timings, die die Spaltennamen StartTime und EndTime hat. Was ich brauche, ist den Unterschied zwischen StartTime und EndTime in der Zeit nur (HH:MM), nicht das Datum, und das Ergebnis, das ich nach dem Unterschied, ich brauche monatlich Average dieser Unterschied zu finden. Meine Spalten sind in DateTime Datentyp, die wie folgt sind,Monatliche Durchschnittswerte der verbleibenden Zeit finden

--------------------------------------- 
    STARTTIME    ENDTIME 
--------------------------------------- 
02/08/2016 14:29 02/08/2016 14:30 
07/07/2016 15:37 07/07/2016 15:37 
07/07/2016 15:38 07/07/2016 15:39 
07/07/2016 15:39 07/07/2016 15:39 
07/07/2016 15:40 07/07/2016 15:40 
07/07/2016 15:44 07/07/2016 15:45 
07/07/2016 15:45 07/07/2016 15:45 
07/07/2016 15:46 07/07/2016 15:46 
07/07/2016 15:46 07/07/2016 15:53 
07/07/2016 15:53 07/07/2016 15:54 
07/07/2016 15:54 07/07/2016 15:54 
02/12/2016 9:28  02/12/2016 9:28 
02/12/2016 9:29  02/12/2016 9:29 
02/12/2016 9:30  02/12/2016 9:30 
02/12/2016 9:33  02/12/2016 9:34 
02/12/2016 9:34  02/12/2016 9:35 

Bisher habe ich dies versucht haben,

;With CTTT 
AS (
    Select STARTTIME 
      ,ENDTIME 
      ,(ENDTIME-STARTTIME) AS R 
    From Timings 
) 
Select AVG(Convert(Varchar(10),R,108)) 
From CTTT 

Ich erhalte diese Fehlermeldung,

Msg 8117, Ebene 16, Status 1, Zeile 6 Operand Datentyp varchar ist für avg Betreiber ungültig.

Ich bin nicht gut in SQL, Eine Hilfe wäre sehr spürbar.

+2

was der Datentyp von 'STARTTIME ist, ENDTIME' –

+0

Sein' DATETIME' Datentyp – Ruhaan

+0

Ich brauche Monat weise durchschnittlich verbleibenden Zeit. – Ruhaan

Antwort

1

Hier ist ein funktionierendes Script, das durchschnittliche Datetime Unterschied zu hh konvertiert: mm-Format .

--DROP TABLE #Test 
--DROP TABLE #TestTemp 

CREATE TABLE #Test 
(
    [START]   DATETIME NOT NULL, 
    [END]   DATETIME NOT NULL, 
); 

INSERT INTO #Test 
SELECT 
    '02/08/2016 14:29', '02/08/2016 14:34' 
UNION 
SELECT 
    '02/08/2016 14:39', '02/08/2016 14:47' 

SELECT * FROM #Test 

SELECT 
MONTH([START]) AS 'MONTH', 
YEAR([START]) AS 'YEAR', 
SUBSTRING(CONVERT(VARCHAR, CAST(AVG(CONVERT(FLOAT, [END] - [START])) AS DATETIME),108),1,5) AS 'DIFFERENCE' 
FROM #Test 
GROUP BY 
MONTH([START]), 
YEAR([START]) 

OUTPUT:

START END 
2016-02-08 14:29:00.000 2016-02-08 14:34:00.000 
2016-02-08 14:39:00.000 2016-02-08 14:47:00.000 

MONTH YEAR DIFFERENCE 
2  2016 00:06 

Für Ihre Bequemlichkeit:

SELECT 
MONTH(STARTTIME) AS 'MONTH', 
YEAR(STARTTIME) AS 'YEAR', 
SUBSTRING(CONVERT(VARCHAR, CAST(AVG(CONVERT(FLOAT, ENDTIME-STARTTIME)) AS DATETIME),108),1,5) AS 'DIFFERENCE' 
FROM 
Timings 
GROUP BY 
MONTH(STARTTIME), 
YEAR(STARTTIME) 
+0

Vielen Dank @Ephraim, Es funktioniert für mich :) – Ruhaan

1

Sie shuold versuchen dies. Dies wird den Fehler beheben.

Select Convert (Varchar (10), AVG (R), 108) Von CTTT

+0

Es gibt mir Fehler, Msg 8117, Ebene 16, Status 1, Zeile 6 Operand Datentyp Datetime ist ungültig für avg-Operator. – Ruhaan

+0

Bitte versuchen Sie es jetzt. –

1

Das Versuchen,

select DATEPART(month,starttime) as Mon, 
DATEPART(YEAR,starttime) as Years , 
avg(Convert(int,Hours)) as Hours, 
AVG(Convert(int,minute)) as minutes from (select starttime,endtime, 
convert(varchar(5),DateDiff(s, starttime, endtime)/3600) as Hours,convert(varchar(5), 
DateDiff(s, starttime, endtime)%3600/60) as minute 
from timings) as tbl 
group by DATEPART(month,starttime),DATEPART(YEAR,starttime)