如何在cakephp 3中获取上个月的行总和
How to get last month row sum in cakephp 3
我需要获取上个月的交易金额总和,我写了查询但出现错误 Error: Call to undefined function App\Controller\YEAR()
// sum of total received amount
$conditions['transaction_type']=1;
$conditions['AND']['YEAR(Transactions.created) >='] = YEAR('CURRENT_DATE - INTERVAL 1 MONTH');
$conditions['AND']['MONTH(Transactions.created) <='] = MONTH('CURRENT_DATE - INTERVAL 1 MONTH');
$query = $this->Transactions->find('all',['conditions'=>$conditions]);
$collection = new Collection($query);
$sumOfReceivedAmount = $collection->sumOf('amount');
$this->set('sumOfReceivedAmount',$sumOfReceivedAmount);
我也尝试过使用查询生成器
$query = $this->Transactions->find()
->where(function ($exp, $q) {
$year = $q->func()->year([
'created' => 'identifier'
]);
$month = $q->func()->month([
'created' => 'identifier'
]);
return $exp
->eq($year, $q->func()->year(['CURRENT_DATE - INTERVAL 1 MONTH']))
->eq($month, $q->func()->month(['CURRENT_DATE - INTERVAL 1 MONTH']));
});
对于此代码,我收到类似
的查询
SELECT
*
FROM
transactions Transactions
WHERE
(
year(created) = (
year(
'CURRENT_DATE - INTERVAL 1 MONTH'
)
)
AND month(created) = (
month(
'CURRENT_DATE - INTERVAL 1 MONTH'
)
)
)
问题是这个单引号 'CURRENT_DATE - INTERVAL 1 MONTH'
如何删除这个单引号?
与您将传递的值声明为 identifier
的其他 year()
用法类似,您必须将其他值声明为 literal
值(或传递表达式对象),以便它们按原样插入到查询中,而不是被绑定。
['CURRENT_DATE - INTERVAL 1 MONTH' => 'literal']
CakePHP 还附带了表达类似功能的方法,特别是 FunctionsBuilder::dateAdd()
方法。此外,当将 CURRENT_DATE
表示为函数时,查询构建器将能够为其他 DBMS(例如没有 CURRENT_DATE
:
的 SqlServer 转换 SQL
$q->func()->year(
[$q->func()->dateAdd($q->func()->CURRENT_DATE(), -1, 'MONTH')]
)
NOW()
也应该有效:
$q->func()->dateAdd($q->func()->now(), -1, 'MONTH')
另见
我需要获取上个月的交易金额总和,我写了查询但出现错误 Error: Call to undefined function App\Controller\YEAR()
// sum of total received amount
$conditions['transaction_type']=1;
$conditions['AND']['YEAR(Transactions.created) >='] = YEAR('CURRENT_DATE - INTERVAL 1 MONTH');
$conditions['AND']['MONTH(Transactions.created) <='] = MONTH('CURRENT_DATE - INTERVAL 1 MONTH');
$query = $this->Transactions->find('all',['conditions'=>$conditions]);
$collection = new Collection($query);
$sumOfReceivedAmount = $collection->sumOf('amount');
$this->set('sumOfReceivedAmount',$sumOfReceivedAmount);
我也尝试过使用查询生成器
$query = $this->Transactions->find()
->where(function ($exp, $q) {
$year = $q->func()->year([
'created' => 'identifier'
]);
$month = $q->func()->month([
'created' => 'identifier'
]);
return $exp
->eq($year, $q->func()->year(['CURRENT_DATE - INTERVAL 1 MONTH']))
->eq($month, $q->func()->month(['CURRENT_DATE - INTERVAL 1 MONTH']));
});
对于此代码,我收到类似
的查询SELECT
*
FROM
transactions Transactions
WHERE
(
year(created) = (
year(
'CURRENT_DATE - INTERVAL 1 MONTH'
)
)
AND month(created) = (
month(
'CURRENT_DATE - INTERVAL 1 MONTH'
)
)
)
问题是这个单引号 'CURRENT_DATE - INTERVAL 1 MONTH'
如何删除这个单引号?
与您将传递的值声明为 identifier
的其他 year()
用法类似,您必须将其他值声明为 literal
值(或传递表达式对象),以便它们按原样插入到查询中,而不是被绑定。
['CURRENT_DATE - INTERVAL 1 MONTH' => 'literal']
CakePHP 还附带了表达类似功能的方法,特别是 FunctionsBuilder::dateAdd()
方法。此外,当将 CURRENT_DATE
表示为函数时,查询构建器将能够为其他 DBMS(例如没有 CURRENT_DATE
:
$q->func()->year(
[$q->func()->dateAdd($q->func()->CURRENT_DATE(), -1, 'MONTH')]
)
NOW()
也应该有效:
$q->func()->dateAdd($q->func()->now(), -1, 'MONTH')
另见