【问题标题】:I need to count the today created account in Cake 3我需要在 Cake 3 中计算今天创建的帐户
【发布时间】:2015-05-25 22:32:45
【问题描述】:

我需要统计用户,但我的条件是他们的帐户今天已创建。我有一个用户表,其中每行都有一个创建的字段(日期时间)。我怎么在 Cakephp 中做到这一点,我在文档中没有找到答案。

$usersNewCount = Number::format($this->Users->find()->where(['created' => 'CURDATE()'])->count());

我尝试过使用 CURDATE,当然它不起作用,我猜 Cakephp 对日期时间字段有特定的功能?

【问题讨论】:

  • 问题是created 是一个日期时间字段,我猜。所以在你的条件下尝试['DATE(created)' => 'CURDATE()']

标签: cakephp cakephp-3.0


【解决方案1】:

由于各种原因,您在那里所做的事情不会奏效。

  1. 你不能在条件数组的值部分传递 SQL sn-ps,它会被转义,你最终会得到像created = 'CURDATE()' 这样的字符串比较,你要么必须传递整个条件作为字符串,或使用raw expressions

  2. 即使正确传递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'

另见

【讨论】:

    【解决方案2】:

    你可以这样做

    $usersNewCount = Number::format($this->Users->find()->where([
        'DATE(created) = CURDATE()'
    ])->count());
    

    请注意,以where(['DATE(created)' => 'CURDATE()']) 的形式传递它是行不通的,因为CURDATE() 将被解释为字符串。

    【讨论】:

    • 您应该始终尽量避免与计算的列进行比较,因为这会使使用索引变得不可能。
    • 这个答案对我有用,虽然它可能有一个缺点,比如不能使用索引。
    【解决方案3】:

    当执行 '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());
    

    【讨论】:

    • 这行不通,值部分会被转义,如果不行,你会得到像CURDATE() 00:00:00这样的无效SQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多