查找每月剩余时间的平均值

时间:2016-07-13 06:38:30

标签: sql sql-server sql-server-2008-r2

我正在使用SQL Server 2008R2,我有一个名为StartTime的表,其列名为EndTimeStartTime。 我需要的是找到EndTime(HH:MM)之间的时间Average之间的差异,而不是日期,以及差异之后得到的结果,我需要每月{{1}这种差异。 我的列采用DateTime数据类型,如下所示,

---------------------------------------
   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

到目前为止,我已尝试过这个,

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

我收到此错误消息,

  

Msg 8117,Level 16,State 1,Line 6   操作数数据类型varchar对于avg运算符无效。

我不擅长SQL,帮助会很明显。

3 个答案:

答案 0 :(得分:1)

你不要试试这个。这将解决您的错误。

选择转换(Varchar(10),AVG(R),108) 来自CTTT

答案 1 :(得分:1)

试试这个,

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)

答案 2 :(得分:1)

这是一个将平均日期时间差异转换为hh:mm格式的工作脚本。

--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])

输出:

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

为方便起见:

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)