我需要计算用户数,但我的情况是,只有他们的帐户今天已创建。我有一个用户表,每个行都有一个创建的字段(日期时间)。我怎么能在Cakephp中做到这一点,我在文档中找不到答案。
$usersNewCount = Number::format($this->Users->find()->where(['created' => 'CURDATE()'])->count());
我尝试使用CURDATE,当然它没有用,我猜Cakephp有一个特定的日期时间字段功能吗?
答案 0 :(得分:2)
你在那里做的事情因各种原因而无法工作。
你不能在条件数组的值部分传递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'
另见
答案 1 :(得分:1)
你可以这样做
$usersNewCount = Number::format($this->Users->find()->where([
'DATE(created) = CURDATE()'
])->count());
请注意,以where(['DATE(created)' => 'CURDATE()'])
格式传递它将无效,因为CURDATE()
将被解释为字符串。
答案 2 :(得分:0)
在做'created'=&gt;时'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());