我正在努力解决我认为简单的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
的方式。
答案 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
上的Time
,Time
类型不支持此类型,因此您必须先将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';