如何比较两个日期的月份?

时间:2017-01-14 13:54:29

标签: sql cakephp cakephp-3.0 query-builder

我正在尝试查询当前月份的查询,这是我的查询:

 $clients = $this->Clients;
    $query = $clients->find();

    if($this->Auth->user('role') !== 'admin'){
        $query->where(['user_id =' => $this->Auth->user('id')]);
        $query->where(['MONTH(dob) = ' => 'EXTRACT(month FROM (NOW()))']);

        $query->order(['dob' => 'ASC']);

    }

它返回0条记录(我的字段是日期类型),但phpmyadmin中的此查询有效:

SELECT * FROM `clients` WHERE MONTH(dob) = EXTRACT(month FROM (NOW()))

我做错了什么?

1 个答案:

答案 0 :(得分:1)

只需查看实际生成的查询(查看您的DBMS查询日志,或尝试DebugKit),它看起来会有所不同,因为key => value条件集中的右侧值受制于参数结合/铸造/报价/逸出。在你的情况下,它将被视为一个字符串,因此条件最终将类似于:

WHERE MONTH(dob) = 'EXTRACT(month FROM (NOW()))'

这当然不会与任何事情相提并论。

您可以将整个SQL片段作为单个数组值或表达式对象传递,这样就可以将其插入到查询中(不要以这种方式插入用户值,这会产生SQL注入漏洞! ),但我建议改用便携式函数表达式。

CakePHP附带EXTRACTNOW的函数表达式,因此您可以执行以下操作:

use Cake\Database\Expression\IdentifierExpression;
use Cake\Database\Expression\QueryExpression;
use Cake\ORM\Query;

// ...

$query->where(function (QueryExpression $exp, Query $query) {
    return $exp->eq(
        $query->func()->extract('MONTH', new IdentifierExpression('dob')),
        $query->func()->extract('MONTH', $query->func()->now())
    );
});

看起来有点复杂,但它值得,它是跨DBMS便携式以及自动引用兼容。生成的SQL看起来像

WHERE EXTRACT(MONTH FROM (dob)) = (EXTRACT(MONTH FROM (NOW())))

另见