我需要在 Cake 3 中统计今天创建的帐户
I need to count the today created account in Cake 3
我需要统计用户数,但我的条件是他们的账号必须是今天创建的。我有一个用户 table,每行都有一个创建的字段(日期时间)。在Cakephp中怎么实现,我没有在文档中找到答案。
$usersNewCount = Number::format($this->Users->find()->where(['created' => 'CURDATE()'])->count());
我尝试使用 CURDATE,当然它不起作用,我想 Cakephp 对日期时间字段有特定的功能?
在执行 'created' => 'CURDATE()' 时,您正在检查一个完整的匹配项,得到“2015-05-26”,没有时间。您需要检查时间间隔:
$usersNewCount = Number::format(
$this->Users->find()->where([
'created >=' => date('Y-m-d').' 00:00:00',
'created <=' => date('Y-m-d').' 23:59:59'
])->count());
你可以这样做
$usersNewCount = Number::format($this->Users->find()->where([
'DATE(created) = CURDATE()'
])->count());
请注意,以 where(['DATE(created)' => 'CURDATE()'])
形式传递它不会起作用,因为 CURDATE()
将被解释为字符串。
由于各种原因,您在那里所做的工作不会奏效。
你不能在条件数组的值部分传递 SQL 片段,它会被转义,你最终会得到像 created = 'CURDATE()'
这样的字符串比较,你要么必须将整个条件作为字符串传递,要么使用 raw expressions.
即使正确传递 CURDATE()
,比较也不会起作用,因为 created
列有时间部分。
虽然可以通过转换列来规避前一个问题,但您应该尽可能避免这样做!与 DATE(created) = CURDATE()
这样的计算列相比,将无法使用索引,从而大大降低性能!
因此,除非您有一个仅包含日期部分的额外列,否则最好的选择是 BETWEEN
比较,它等同于 a >= x AND a <= y
,并且为了保持跨 DBMS 兼容,这最好通过从 PHP 传递日期来完成,即不要使用 DBMS 特定的日期和时间函数,如 CURDATE()
.
$this->Users
->find()
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
$from = (new \DateTime())->setTime(0, 0, 0);
$to = (new \DateTime())->setTime(23, 59, 59);
return $exp->between('Users.created', $from, $to, 'datetime');
})
->count()
这将创建一个类似于
的查询
SELECT
(COUNT(*)) AS `count`
FROM
users Users
WHERE
Users.created BETWEEN '2015-05-26 00:00:00' AND '2015-05-26 23:59:59'
另见
我需要统计用户数,但我的条件是他们的账号必须是今天创建的。我有一个用户 table,每行都有一个创建的字段(日期时间)。在Cakephp中怎么实现,我没有在文档中找到答案。
$usersNewCount = Number::format($this->Users->find()->where(['created' => 'CURDATE()'])->count());
我尝试使用 CURDATE,当然它不起作用,我想 Cakephp 对日期时间字段有特定的功能?
在执行 'created' => 'CURDATE()' 时,您正在检查一个完整的匹配项,得到“2015-05-26”,没有时间。您需要检查时间间隔:
$usersNewCount = Number::format(
$this->Users->find()->where([
'created >=' => date('Y-m-d').' 00:00:00',
'created <=' => date('Y-m-d').' 23:59:59'
])->count());
你可以这样做
$usersNewCount = Number::format($this->Users->find()->where([
'DATE(created) = CURDATE()'
])->count());
请注意,以 where(['DATE(created)' => 'CURDATE()'])
形式传递它不会起作用,因为 CURDATE()
将被解释为字符串。
由于各种原因,您在那里所做的工作不会奏效。
你不能在条件数组的值部分传递 SQL 片段,它会被转义,你最终会得到像
created = 'CURDATE()'
这样的字符串比较,你要么必须将整个条件作为字符串传递,要么使用 raw expressions.即使正确传递
CURDATE()
,比较也不会起作用,因为created
列有时间部分。
虽然可以通过转换列来规避前一个问题,但您应该尽可能避免这样做!与 DATE(created) = CURDATE()
这样的计算列相比,将无法使用索引,从而大大降低性能!
因此,除非您有一个仅包含日期部分的额外列,否则最好的选择是 BETWEEN
比较,它等同于 a >= x AND a <= y
,并且为了保持跨 DBMS 兼容,这最好通过从 PHP 传递日期来完成,即不要使用 DBMS 特定的日期和时间函数,如 CURDATE()
.
$this->Users
->find()
->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
$from = (new \DateTime())->setTime(0, 0, 0);
$to = (new \DateTime())->setTime(23, 59, 59);
return $exp->between('Users.created', $from, $to, 'datetime');
})
->count()
这将创建一个类似于
的查询SELECT
(COUNT(*)) AS `count`
FROM
users Users
WHERE
Users.created BETWEEN '2015-05-26 00:00:00' AND '2015-05-26 23:59:59'
另见