MySQL:检索特定时间范围内的记录数

时间:2009-06-10 18:54:18

标签: 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
 5     1      2009-06-10 11:20:36

基本上,我希望在指定的时间范围内(小时,日,周,月,年)获得结果。我已经有点工作了几天......但是我无法返回包含零计数的timeframs的结果。基本上我想给它一个时间框架和一个分隔符(小时,天等),并能够在该时间范围内从表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                            | 
+-------+-------------------------------------+

但这并未考虑时间范围。有什么想法吗?

5 个答案:

答案 0 :(得分:1)

我建议的通常做法是:

SELECT COUNT(*) AS `num`
FROM `table`
WHERE `created_at` >= '2009-09-06 00:00:00'
AND `created_at` < '2009-09-07 00:00:00'

即。在您的日期/时间范围内直接查询,解决了不同时间跨度等问题。如果表中有足够的记录,created_at上的索引就会变得无用,但它仍然可以比与DATE_FORMAT结果进行比较更好;除非查询优化器比我认为的更聪明,否则将针对每一行运行DATE_FORMAT并比较结果,而不是根本没有使用索引。

我怀疑有些东西我没有处理你的情况,这使得这对你不起作用,或者你已经这样做了,但我想我将不得不等待反馈,看看那些是什么是

答案 1 :(得分:0)

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");

答案 2 :(得分:0)

SELECT COUNT(*), created_at
FROM v
WHERE p_id = 56 
   and created_at >= sometime and created_at <= dateadd(hour,1,sometime)

您还可以添加日期,年份等,以获得您想要的时间范围。

有关详细信息,请参阅此链接:http://msdn.microsoft.com/en-us/library/ms186819.aspx

答案 3 :(得分:0)

从时间戳开始,而不是日期:

SELECT COUNT(*),DATE_FORMAT(FROM_UNIXTIME(created_at),“%m。%y”)AS mDate FROM v GROUP BY mDate

答案 4 :(得分:0)

一旦你没有任何给定时间段的记录,MySQL服务器就无法获得那个时期的总和。所有提议的解决方案(包括您的解决方案)都可以工作,但不会在没有记录的时间范围内返回任何行。

如果您在应用程序中使用此查询,我建议您在网格上手动创建零计数的行,或者用于显示结果的任何内容。