2013-08-21 282 views
1

我一直在Google和SO搜索最后25分钟搜索如何在MySQL中执行以下操作。在日期范围内计算每个日期的行数

目前,我有以下查询(通过PHP发送):

SELECT 
    COUNT(*), 
    `$db`.`crop`.`id` AS `crop`, 
    `$db`.`crop`.`harvest_date` AS `harvest_date` 
FROM 
    `$db`.`crop` 
WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN $startDate AND $endDate 
GROUP BY `$db`.`crop`.`harvest_date` 

$startDate = 2012-01-01 
$endDate = 2013-07-01 

我试图找到所有已开始和结束日期之间的harvest_date行,再算上那年秋天的行数在同一天。但是,我似乎没有得到任何结果。查询不会失败,它只是不会返回任何内容。任何人都可以指出我正确的方向/告诉我我错了吗?

编辑:发现问题。正如Michael在下面指出的那样,日期并没有像日期那样通过,而是数字。我通过在查询中的startDate和endDate之前和之后添加了解决方案。

+1

应该为查询失败。你的日期文字需要用单引号字符串。如''startDate ='2012-01-01'' –

+1

当您通过'harvest_date'进行分组时,您必须使用某种聚集函数(例如'min()','max()'或'group_concat )''为'id'。 – cars10m

+0

哪种类型是'harvest_date'? –

回答

3

MySQL期望日期文字为单引号字符串,如'2012-01-01''2013-07-01'

由于您没有引用PHP变量的日期文字,PHP实际上在将整数值传递给查询之前将其解释为整数值的算术运算。

// You see this: 
$startDate = 2012-01-01 
$endDate = 2013-07-01 

// PHP does this: 
// 2012 - 1 - 1 = 2010 
$startDate = 2010 
// 2013 - 7 - 1 = 2005 
$endDate = 2005 

您所查询的最终使用这样的:

WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN 2010 AND 2005 

和MySQL会投这两个整数的DATE,将返回NULL

mysql> SELECT CAST(2010 AS DATE); 
+--------------------+ 
| CAST(2010 AS DATE) | 
+--------------------+ 
| NULL    | 
+--------------------+ 

所以简单的解决方法是:

$startDate = '2012-01-01'; 
$endDate = '2013-07-01'; 

如果你最终将它转换为一个参数化查询,占位符的正确引用愿意为你办理。

1

获得给定日期范围之间的计数。将查询修改为

SELECT 
    COUNT(`$db`.`crop`.`id`), 
FROM 
    `$db`.`crop` 
WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN $startDate AND $endDate 

将结果分组为“harvest_date”将决定该特定日期的计数并对它们进行分组。

例如: 如果表等

2013年8月21日

2013年8月21日

2013年8月20日

然后分组会给

不进行分组