所以我想做的事情有点棘手。我正在尝试提出一个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 |
+-------+-------------------------------------+
但这并未考虑时间范围。有什么想法吗?
答案 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服务器就无法获得那个时期的总和。所有提议的解决方案(包括您的解决方案)都可以工作,但不会在没有记录的时间范围内返回任何行。
如果您在应用程序中使用此查询,我建议您在网格上手动创建零计数的行,或者用于显示结果的任何内容。