2016-04-28 98 views
1

我正在努力解决我认为是简单的SQL查询问题。运行SQL Server 2014SQL Query - 从日期时间字段开始的平均时间

我有一个SQL表,“访问”:

Id | EntryTime | Duration 

而且我想找到两个日期之间日的平均入职时间,同时考虑到这些日期之间的所有记录。

所以如果我的我的日期之间EntryTime领域是:

2016-04-28 12:00:00 
2016-04-20 10:00:00 
2016-04-19 08:00:00 
2016-04-17 10:00:00 

然后返回的平均时间应该仅仅是:

10:00:00 

日期不应当考虑在所有的,它应以字符串格式返回,或仅返回10:00:00

回答

7
create table mytimes(
    id int identity, 
    mydatetime datetime 
) 

insert into mytimes (mydatetime) values ('2016-04-28 12:00:00') 
insert into mytimes (mydatetime) values ('2016-04-20 10:00:00') 
insert into mytimes (mydatetime) values ('2016-04-19 08:00:00') 
insert into mytimes (mydatetime) values ('2016-04-17 10:00:00') 

SELECT Cast(DateAdd(ms, AVG(CAST(DateDiff(ms, '00:00:00', cast(mydatetime as time)) AS BIGINT)), '00:00:00') as Time) 
from mytimes 
-- where mydatetime between XXX and YYY 

SELECT convert(varchar(8), Cast(DateAdd(ms, AVG(CAST(DateDiff(ms, '00:00:00', cast(mydatetime as time)) AS BIGINT)), '00:00:00') as Time)) 
from mytimes 
-- where mydatetime between XXX and YYY 

输出110:00:00.0000000 - 这是一个实际的时间类型如果需要,你可以做更多的事

输出210:00:00 - 这是输出为VARCHAR(8)

添加您的where子句,你认为合适

的步骤包括

  • 铸造到Time类型从一个DateTime
  • 使用上TimeAVG,这不是由Time类型支持,所以你必须先转换Time到毫秒。
  • 转换毫秒回
  • 一个Time类型为避免你Arithmetic overflow error converting expression to data type int可以投的DateAdd结果为BigInt。或者,您可以在DateDiff函数中使用seconds而不是milliseconds函数,除非结果集过大,否则它应该可以工作。

SO来源:

+0

请求输出的格式错误。 – GibralterTop

+1

@GibralterTop - OP确实指定了结果,但从未如果它应该是varchar或类型Time。虽然公平,但我添加了一个转换为varchar(8)的另一行来显示或者可以检索。 – Igor

+0

我在这个“算术溢出错误将表达式转换为数据类型int”时出现以下错误。 – JonnyKnottsvill

0

邑,你可以使用Time()来完成这件事。

您的查询就会成为这样的(相应的修改)

SELECT COUNT(*) FROM Visits WHERE TIME(EntryTime) > '06:00' AND EntryTime < '18:00'; 
+1

的OP是要求的平均时间,而不是记录的计数。另外我不相信'TIME(DateTime)'是Sql Server中的一个内置函数,如果可以的话你可以参考文档吗? – Igor

1
SELECT CONVERT(TIME, DATEADD(SECOND, AVG(DATEDIFF(SECOND, 0, CONVERT(TIME, EntryTime))), 0)) 
FROM Visits 
WHERE EntryTime >= @begin AND EntryTime <= @end 

的想法来自这里:T-SQL calculating average time

+0

这得到正确的时间,我将如何修剪结束不显示毫秒? – JonnyKnottsvill

相关问题