1

在过去的 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

我正在尝试查找在开始日期和结束日期之间具有收获日期的所有行,然后计算同一日期的行数。但是,我似乎没有得到任何结果。查询不会失败,它只是不返回任何内容。谁能指出我正确的方向/告诉我哪里做错了?

编辑:发现问题。正如迈克尔在下面指出的那样,日期不是作为日期传递的,而是作为数字传递的。我通过在查询中的 startDate 和 endDate 之前和之后添加 ' 解决了这个问题。

4

3 回答 3

3

MySQL 期望日期文字是单引号字符串,例如'2012-01-01'and '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 会将这两个整数都转换为 a DATE,这将返回NULL

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

所以简单的解决方法是:

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

如果您最终将其转换为参数化查询,则会为您处理正确的占位符引用。

于 2013-08-21T11:10:02.190 回答
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

于 2013-08-21T11:12:26.290 回答
0

我知道这是一个旧帖子,但这对我有用

SELECT count(*),date(LSTUPDTIM),SUM(TOTAL) FROM order_table where LSTUPDTIM between '2018-01-20' and '2019-01-29' group by date(LSTUPDTIM) ;

,

我的 LSTUPDTIM 是一个时间戳,这就是为什么我必须使用 date() 这给了我这样的输出

5 2019-01-25 500

2 2019-01-28 200

5 2019-01-29 500

于 2019-01-31T20:08:11.333 回答