Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:从特定时间段检索记录数_Mysql_Datetime_Count - Fatal编程技术网

MySQL:从特定时间段检索记录数

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

所以我想做的有点棘手。我试图提出一个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                            | 
+-------+-------------------------------------+

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

我通常会推荐这样做:

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服务器将无法计算该时间段的总和。所有建议的解决方案(包括您的)都可以工作,但在没有记录的时间范围内不会返回任何行

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