[英]How to count at specific date range in mysql
我创建了此mysql
代码以仅在特定日期范围内进行计数,我转储了mysql代码的输出,此处为:
SELECT COUNT(
IF(
DATE(q.date_emailed) BETWEEN '2014-02-01' AND '2014-02-28',
1,
0
)
) AS 'Feb',
COUNT(
IF(
DATE(q.date_emailed) BETWEEN '2014-03-01' AND '2014-03-31',
1,
0
)
) AS 'March',
COUNT(
IF(
DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-01-31',
1,
0
)
) AS 'Jan'
FROM
database.quotes q
WHERE (DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-03-31')
但这每月输出相同的计数,其中我确认2月和3月计数为零。 我在这里想念什么?
COUNT()
计算非空值。 您可以改用sum()
来修复代码。 您也可以通过删除if
语句来简化它:
SELECT SUM(DATE(q.date_emailed) BETWEEN '2014-02-01' AND '2014-02-28') AS Feb,
SUM(DATE(q.date_emailed) BETWEEN '2014-03-01' AND '2014-03-31') AS March,
SUM(DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-01-31') AS Jan
FROM database.quotes q
WHERE DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-03-31';
在MySQL中,布尔结果对于“ false”被视为0
对于“ true”被视为1
。 这是一个极大的方便,它允许您使用sum()
来计算匹配数。
请注意,我还删除了列名周围的单引号。 单引号应用于字符串和日期常量,而不用于标识符。
编辑:
通过使用q.date_emailed
上的索引,可以使此查询运行更快。 但是,我不认为由于date()
函数会使用索引。 您可以通过更改逻辑来解决此问题:
SELECT SUM(DATE(q.date_emailed) BETWEEN '2014-02-01' AND '2014-02-28') AS Feb,
SUM(DATE(q.date_emailed) BETWEEN '2014-03-01' AND '2014-03-31') AS March,
SUM(DATE(q.date_emailed) BETWEEN '2014-01-01' AND '2014-01-31') AS Jan
FROM database.quotes q
WHERE q.date_emailed >= '2014-01-01' AND
q.date_emailed < '2014-04-01';
如果要累加0和1,则应使用SUM而不是COUNT。
COUNT将对行数进行计数,SUM将对这些值求和。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.