数据库
首页 > 数据库> > mysql-SQL:每小时平均间隔几天

mysql-SQL:每小时平均间隔几天

作者:互联网

我有一个包含START_DATE和END_DATE列的表.

我想检索过去几天中这些时间戳之间每小时的平均时差,但仅检索上午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,有人有什么想法吗?

解决方法:

如果要多天,则需要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

标签:sql,mysql,group-by
来源: https://codeday.me/bug/20191208/2092571.html