我有一个出租车数据库,有两个日期时间字段'BookedDateTime'和'PickupDateTime'。客户需要知道从预订出租车到驾驶员实际“接载”客户的平均等待时间。
数据库中有一堆行,涵盖了几个月的数据。
目标是制作一个向我显示每日平均值的查询。
所以一个非常简单的例子是:
BookedDateTime | PickupDateTime
2014-06-09 12:48:00.000 2014-06-09 12:45:00.000
2014-06-09 12:52:00.000 2014-06-09 12:58:00.000
2014-06-10 20:23:00.000 2014-06-10 20:28:00.000
2014-06-10 22:13:00.000 2014-06-10 22:13:00.000
2014-06-09((-3 + 6)/ 2)=平均时间为00:03:00.000(3分钟)
2014-06-10((5 + 0)/ 2)=平均值为00:02:30.000(2.5分钟)
这是可能的还是我需要在代码中进行一些数字处理(即C#)?
任何指针都会非常感激。
答案 0 :(得分:4)
我认为这样做:
select Convert(date, BookedDateTime) as Date, AVG(datediff(minute, BookedDateTime, PickupDateTime)) as AverageTime
from tablename
group by Convert(date, BookedDateTime)
order by Convert(date, BookedDateTime)
答案 1 :(得分:2)
使用预订时间当天作为报告日期:
select
convert(date, BookedDateTime) as day,
AVG(DATEDIFF(minute, PickupDateTime, BookedDateTime)) as avg_minutes
from bookings
group by convert(BookedDateTime, datetime, 101)
答案 2 :(得分:1)
请尝试:
IF OBJECT_ID(N'tempdb..#TEMP') > 0
BEGIN
DROP TABLE #TEMP
END
CREATE TABLE #TEMP(BookedDateTime DateTime,
PickupDateTime DateTime)
INSERT INTO #TEMP
VALUES
('2014-06-09 12:48:00.000', '2014-06-09 12:45:00.000'),
('2014-06-09 12:52:00.000', '2014-06-09 12:58:00.000'),
('2014-06-10 20:23:00.000', '2014-06-10 20:28:00.000'),
('2014-06-10 22:13:00.000', '2014-06-10 22:13:00.000'),
('2014-06-10 23:59:00.000', '2014-06-11 00:01:00.000')
SELECT CAST(BookedDateTime AS DATE) AS YMDDate,
CONVERT(CHAR(8), DATEADD(second, AVG(DATEDIFF(s, BookedDateTime, PickupDateTime)), 0), 108) [hh:mi:ss],
CONVERT(CHAR(15), DATEADD(second, AVG(DATEDIFF(s, BookedDateTime, PickupDateTime)), 0), 114) [hh:mi:ss:mmm(24h)]
FROM #TEMP
GROUP BY CAST(BookedDateTime AS DATE)
答案 3 :(得分:0)
这可以通过找出每一行的差异,将它们相加并除以行数来完成。
在SQLSERVER中,它将如下所示。
SELECT SUM(DATEDIFF(MINUTE,BookedDateTime,PickupDateTime)) * 1.0
/ (SELECT COUNT(*) * 1.0 FROM MyTable)
FROM MyTable