SQL查询 - 从datetime字段开始的平均时间

时间:2016-04-28 14:46:54

标签: sql-server datetime

我正在努力解决我认为简单的SQL查询问题。运行SQL Server 2014

我有一个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的方式。

3 个答案:

答案 0 :(得分:9)

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

output-1 10:00:00.0000000 - 这是一个实际的时间类型,如果需要,您可以执行更多操作

output-2 10:00:00 - 输出为varchar(8)

根据需要添加您的where子句

步骤包括

  • Time投射到DateTime类型。
  • 使用AVG上的TimeTime类型不支持此类型,因此您必须先将Time转换为毫秒。
  • 将毫秒转换回Time类型
  • 要避免Arithmetic overflow error converting expression to data type int,您可以将DateAdd的结果投射到BigInt。或者,您可以在seconds函数中使用milliseconds代替DateDiff,除非您的结果集过大,否则该函数应该有效。

SO来源:

答案 1 :(得分: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

答案 2 :(得分:0)

是的,您可以使用Time()来完成此操作。

您的查询会变成这样(相应地修改)

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