首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL中的小时设置报告

MySQL中的小时设置报告
EN

Database Administration用户
提问于 2016-06-02 14:36:28
回答 1查看 492关注 0票数 1

我有一个每日报告系统,它显示一个特定的电信员在一天内的电话数量。而且效果很好。

我想把它再分成几个小时,例如9-10,10-11等等。

当前mysql代码如下。请原谅我的代码不完善,我是一个自学的,已经从Stackexchange学到了我的东西。

代码语言:javascript
运行
复制
    SELECT
comments.hrname,
IF((HOUR(comments.date))= '9', COUNT(comments.Outcome),'') AS `9-10`,
IF((HOUR(comments.date)) = '10', COUNT(comments.Outcome),'') AS `10-11`,
IF((HOUR(comments.date)) = '11', COUNT(comments.Outcome),'') AS `11-12`,
IF((HOUR(comments.date)) = '12', COUNT(comments.Outcome),'') AS `12-13`,
IF((HOUR(comments.date)) = '13', COUNT(comments.Outcome),'') AS `13-14`,
IF((HOUR(comments.date)) = '14', COUNT(comments.Outcome),'') AS `14-15`,
IF((HOUR(comments.date)) = '15', COUNT(comments.Outcome),'') AS `15-16`,
IF((HOUR(comments.date)) = '16', COUNT(comments.Outcome),'') AS `16-17`,
IF((HOUR(comments.date)) = '17', COUNT(comments.Outcome),'') AS `17-18`,
IF((HOUR(comments.date)) = '18', COUNT(comments.Outcome),'') AS `18-19`,
IF((HOUR(comments.date)) = '19', COUNT(comments.Outcome),'') AS `19-20`,
IF((HOUR(comments.date)) = '20', COUNT(comments.Outcome),'') AS `20-21`,
IF((HOUR(comments.date)) = '21', COUNT(comments.Outcome),'') AS `21-22`
FROM
comments
WHERE
DATE(comments.date) = DATE(NOW()) AND
MONTH(comments.date) = MONTH(NOW()) AND
YEAR(comments.date) = YEAR(NOW())
GROUP BY
comments.hrname

我得到的结果是:

我哪里出问题了?

这是一个供大约10个用户使用的内部软件,主要是为了消除共享excel的使用,所以SQL注入等并不是真正关心的AFAIK。

任何帮助都将不胜感激。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-06-02 14:56:01

您的查询所做的是将COUNT()放在您想要的列中,但它实际上计算了每一行。只有一个条件,COUNT()将“计数”和“不计数”区分开来。也就是说,无论什么情况,当您计算COUNT(*)的每一行时。当您使用COUNT(column_name)时,它只计算不是NULL的行。不过,那就算了。

你真正想做的是:

代码语言:javascript
运行
复制
SUM(IF((HOUR(comments.date)) = '9', 1, 0)) AS `9-10`,

另一注:

当你做的时候

代码语言:javascript
运行
复制
WHERE
DATE(comments.date) = DATE(NOW()) AND
MONTH(comments.date) = MONTH(NOW()) AND
YEAR(comments.date) = YEAR(NOW())

没有必要对月份和年份进行比较,因为这已经在DATE()中讨论过了。

一个更好的方法就是这样做:

代码语言:javascript
运行
复制
WHERE comments.date BETWEEN CURDATE() AND CONCAT(CURDATE(), ' 23:59:59')

代码语言:javascript
运行
复制
WHERE comments.date >= CURDATE() 
AND comments.date < CURDATE() + INTERVAL 1 DAY

这是因为当您在列上使用函数时,MySQL不能在列上使用索引(如果有索引的话)。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/140234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档