我在过去的25分钟内一直在搜索Google和SO,以便在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的所有行,然后计算落在同一日期的行数。但是,我似乎没有得到任何结果。查询不会失败,它只是不返回任何内容。谁能指出我正确的方向/告诉我哪里弄错了?
编辑:发现问题。正如迈克尔在下面指出的那样,日期并没有作为日期传递,而是作为数字。我通过在查询中添加'之前和之后的startDate和endDate来解决这个问题。答案 0 :(得分: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 :(得分: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日
然后分组将给出
2
1
没有分组
3
答案 2 :(得分:0)
我知道这是旧的文章,但是这为我工作
从order_table中选择count(*),date(LSTUPDTIM),SUM(TOTAL),其中LSTUPDTIM在'2018-01-20'和'2019-01-29'之间按日期分组(LSTUPDTIM);
,
我的LSTUPDTIM是一个时间戳,这就是为什么我不得不使用date() 给了我这样的输出
5 2019-01-25 500
2 2019年1月28日200
5 2019-01-29 500