2011-03-25 83 views
3

我有一个包含START_DATE和END_DATE列的表。SQL:平均每小时,在几次之间,几天之内

我想检索这些时间戳之间每个小时的平均时间差,但只能在上午9点到下午6点之间,在过去几天的过程中。我想输出看起来像这样:

elapsed hour 
------------- 
2.5  11 <--today at 11AM 
1.7  10 
2.4  9 
1.9  18 <--this is yesterday 
2.4  17 
4.0  16 

我相信我是相当接近,但我不能让代码工作。以下是我有:

SELECT 
    TRUNCATE(AVG(TIME_TO_SEC(TIMEDIFF(END_DATE, START_DATE))/60), 2) as elapsed, 
    EXTRACT(HOUR FROM END_DATE) as hour 
FROM 
    TIME_INFO 
WHERE 
    EXTRACT(HOUR FROM END_DATE) BETWEEN 9 AND 18 AND 
    DATE(END_DATE) > CURDATE() - INTERVAL 3 DAY 
GROUP BY 
    EXTRACT(HOUR FROM END_DATE) 
ORDER BY 
    END_DATE DESC 

这是接近的,但只返回我从三天前,而不是跨天要像我想。我使用MySQL 5.0,任何人有任何想法?

回答

3

如果您想要多天,您需要GROUP BY条款中的一天和一小时。目前它在多天的同一小时内平均所有值。 (今天的11,昨天的11,值等,一起平均)

我没有一个简单的方法来测试,但这样的:

SELECT 
    TRUNCATE(AVG(TIME_TO_SEC(TIMEDIFF(END_DATE, START_DATE))/60), 2) as elapsed, 
    EXTRACT(DAY FROM END_DATE) as day, 
    EXTRACT(HOUR FROM END_DATE) as hour 
FROM 
    TIME_INFO 
WHERE 
    EXTRACT(HOUR FROM END_DATE) BETWEEN 9 AND 18 AND 
    DATE(END_DATE) > CURDATE() - INTERVAL 3 DAY 
GROUP BY 
    EXTRACT(DAY FROM END_DATE), 
    EXTRACT(HOUR FROM END_DATE) 
ORDER BY 
    END_DATE DESC 

如果你希望它在整个工作你可能会想DATE(END_DATE)而非EXTRACT(DAY FROM END_DATE)月/年的边界,在这种情况下,输出可能看起来像:

elapsed date  hour 
------------------------- 
2.5  2011/03/25 11 <--today at 11AM 
1.7  2011/03/25 10 
2.4  2011/03/25 9 
1.9  2011/03/24 18 <--this is yesterday 
2.4  2011/03/24 17 
4.0  2011/03/24 16 
+0

是的,这并获得成功。如果我继续得到这样的好建议,我会最终找出SQL!非常感谢。 – Yottagray 2011-03-25 20:59:49

相关问题