MySQL:从特定时间段检索记录数
所以我想做的有点棘手。我试图提出一个sql查询,它将能够返回指定时间范围内的计数。所以我有一张桌子“v”。下面是表v中的一些基本数据MySQL:从特定时间段检索记录数,mysql,datetime,count,Mysql,Datetime,Count,所以我想做的有点棘手。我试图提出一个sql查询,它将能够返回指定时间范围内的计数。所以我有一张桌子“v”。下面是表v中的一些基本数据 Table v _____________ id p_id created_at 1 1 2009-06-09 18:54:17 2 2 2009-06-09 21:51:24 3 2 2009-06-10 18:53:51 4 1 2009-06-10 01:20:36
Table v
_____________
id p_id created_at
1 1 2009-06-09 18:54:17
2 2 2009-06-09 21:51:24
3 2 2009-06-10 18:53:51
4 1 2009-06-10 01:20:36
5 1 2009-06-10 11:20:36
基本上,我希望在指定的时间范围内(小时、天、周、月、年)返回结果。我已经让它工作了好几天了……但是我无法返回包含零计数的时间图的结果。基本上,我想给它一个时间框架和一个分隔符(小时、天等),并能够在该时间框架内从表v中获得行数
这是我目前尝试的:
select count(*) as count, date_format(created_at, "%m/%d/%y") as date from v where p_id = 56 group by date_format(created_at, "%m/%d/%y");
返回
+-------+-------------------------------------+
| count | date_format(created_at, "%m/%d/%y") |
+-------+-------------------------------------+
| 3 | 06/09/09 |
+-------+-------------------------------------+
但这并没有考虑时间范围。有什么想法吗?我通常会推荐这样做:
SELECT COUNT(*) AS `num`
FROM `table`
WHERE `created_at` >= '2009-09-06 00:00:00'
AND `created_at` < '2009-09-07 00:00:00'
选择COUNT(*)作为'num`
从`表`
其中“创建于”>=“2009-09-06 00:00:00”
和“创建于”<'2009-09-07 00:00:00'
i、 e.在日期/时间范围内直接查询,解决不同时间跨度等问题。如果表中有足够的记录,在上创建的索引可能会变得无用,但它仍然比与日期格式结果进行比较要好;除非查询优化器比我认为的更聪明,否则它将针对每一行运行DATE\u格式
,并比较结果,而不是从索引中获得任何用处
我怀疑我没有处理你的情况,这对你不起作用,或者你已经这样做了,但我想我必须等待反馈,看看这些是什么。我通常建议这样做:
SELECT COUNT(*) AS `num`
FROM `table`
WHERE `created_at` >= '2009-09-06 00:00:00'
AND `created_at` < '2009-09-07 00:00:00'
SELECT
COUNT(*) AS cnt,
DATE_FORMAT(created_at, "%m/%d/%y") AS my_date
FROM
v
WHERE
p_id = 56 AND
created_at BETWEEN first_date AND second_date
GROUP BY
DATE_FORMAT(created_at, "%m/%d/%y");
选择COUNT(*)作为'num`
从`表`
其中“创建于”>=“2009-09-06 00:00:00”
和“创建于”<'2009-09-07 00:00:00'
i、 e.在日期/时间范围内直接查询,解决不同时间跨度等问题。如果表中有足够的记录,在上创建的索引可能会变得无用,但它仍然比与日期格式结果进行比较要好;除非查询优化器比我认为的更聪明,否则它将针对每一行运行DATE\u格式
,并比较结果,而不是从索引中获得任何用处
我怀疑我没有处理你的情况,这使你无法工作,或者你已经这样做了,但我想我必须等待反馈,看看这些是什么。SELECT COUNT(*),创建于
SELECT
COUNT(*) AS cnt,
DATE_FORMAT(created_at, "%m/%d/%y") AS my_date
FROM
v
WHERE
p_id = 56 AND
created_at BETWEEN first_date AND second_date
GROUP BY
DATE_FORMAT(created_at, "%m/%d/%y");
从v
其中p_id=56
在>=某时创建,在选择计数(*)时创建,在
从v
其中p_id=56
在>=某个时间创建,在根据时间戳而不是日期创建:
选择COUNT(*),DATE格式(从UNIXTIME(创建时间),%m.%y)作为时间戳中v组的mDate,而不是日期:
选择COUNT(*)、DATE_FORMAT(FROM_UNIXTIME(created_at),“%m.%y”)作为mDate FROM v GROUP BY mDate一旦在给定的时间段内没有任何记录,MySQL服务器将无法计算该时间段的总和。所有建议的解决方案(包括您的)都可以工作,但在没有记录的时间范围内不会返回任何行
如果您在应用程序中使用此查询,我建议您在网格上手动创建计数为零的行,或者使用任何方式显示结果。一旦您在给定时间段内没有任何记录,MySQL服务器将无法计算该时间段的总和。所有建议的解决方案(包括您的)都可以工作,但在没有记录的时间范围内不会返回任何行
如果您在应用程序中使用此查询,我建议您在网格上手动创建计数为零的行,或者使用任何方式显示结果