1

所以我想做的有点棘手。我正在尝试提出一个能够返回指定时间范围内的计数的 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

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

但这没有考虑时间范围。有任何想法吗?

4

5 回答 5

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针对每一行运行并比较结果,而不是完全利用索引。

我怀疑有些事情我没有处理你的情况,这对你不起作用,或者你已经这样做了,但我想我必须等待反馈才能看到这些是什么。

于 2009-06-10T19:01:50.047 回答
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");
于 2009-06-10T19:09:19.643 回答
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

于 2009-06-10T19:31:15.637 回答
0

从时间戳,而不是日期:

SELECT COUNT(*), DATE_FORMAT(FROM_UNIXTIME(created_at), "%m.%y" ) AS mDate FROM v GROUP BY mDate

于 2009-08-31T07:35:11.277 回答
0

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

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

于 2009-11-12T00:30:13.400 回答