计算日期范围内每个日期的行数
Posted
技术标签:
【中文标题】计算日期范围内每个日期的行数【英文标题】:Count rows per date in a date range 【发布时间】:2013-08-21 10:56:34 【问题描述】:在过去的 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 之前和之后添加 ' 解决了这个问题。
【问题讨论】:
查询应该失败。您的日期文字需要是单引号字符串。如$startDate = '2012-01-01'
当您按harvest_date
分组时,您必须对id
使用某种聚合函数(如min()
、max()
或group_concat()
)。
harvest_date
是哪种类型?
id
的值是多少,因为应该将几行组合在一起(按收获日期),并且所有行都可能具有唯一的 ID?这个查询没有多大意义。
@AlmaDoMundo 收获日期是一个日期
【参考方案1】:
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';
如果您最终将其转换为参数化查询,则会为您处理正确的占位符引用。
【讨论】:
【参考方案2】:获取给定日期范围之间的计数。修改查询为
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
【讨论】:
【参考方案3】:我知道这是一篇旧帖子,但这对我有用
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
【讨论】:
以上是关于计算日期范围内每个日期的行数的主要内容,如果未能解决你的问题,请参考以下文章