在表格列(a.paymentDate)
中,日期以Y-m-d H:m:i
格式插入。我想查询特定日期的所有条目。为此,我必须将日期格式从Y-m-d H:m:i
更改为Y-m-d
。我的查询如下。
namespace Regal\SmsBundle\Repository;
use Doctrine\ORM\EntityRepository;
/**
* DailyTransactionRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class DailyTransactionRepository extends EntityRepository
{
public function getDailyPayment($studentId,$paymentDate)
{
$paymentDate= new \DateTime('2013-03-11');
$query = $this->getEntityManager()->createQuery("
SELECT a.id, a.amont, a.paymentDescrip, a.paymentType, a.paymentDate
FROM RegalSmsBundle:DailyTransaction a
WHERE DATE(a.paymentDate) = :paymentDate AND a.students = :studentId
")
->setParameter('studentId', $studentId)
->setParameter('paymentDate', $paymentDate->format('Y-m-d'))
;
return $query->getResult();
}
}
答案 0 :(得分:3)
试试这个,
$query = $this->getEntityManager()->createQuery("
SELECT a.id, a.amont, a.paymentDescrip, a.paymentType, a.paymentDate
FROM RegalSmsBundle:DailyTransaction a
WHERE DATE(a.paymentDate) = :paymentDate AND a.students = :studentId
")
;
$compareTo = new \DateTime('2013-03-11');
$query->setParameters(array(
'studentId' => $studentId,
'PaymentData' => $compareTo->format('Y-m-d')),
));
return $query->getResult();
<强>更新强>
似乎无法识别Date()。所以,让我分享的代码片段工作。您应该添加Custom DQL Function和Register the extension,让您的实体经理了解它。
看看the documentation,这是很好的解释。
同时强>
我认为可以使用DATE_DIFF(date1, date2)进行比较 - 它会为您提供符合您需求的天数差异。
答案 1 :(得分:1)
要获得艾哈迈德的工作答案(假设您使用的是Mysql),您需要添加一个学说扩展。
namespace Cerad\Bundle\GameBundle\Doctrine\DQL;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
/**
* "DATE" "(" SimpleArithmeticExpression ")". Modified from DoctrineExtensions\Query\Mysql\Year
*
* @category DoctrineExtensions
* @package DoctrineExtensions\Query\Mysql
* @author Rafael Kassner <kassner@gmail.com>
* @author Sarjono Mukti Aji <me@simukti.net>
* @license MIT License
*/
class Date extends FunctionNode
{
public $date;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return "DATE(" . $sqlWalker->walkArithmeticPrimary($this->date) . ")";
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->date = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
然后查看食谱,了解如何通过在实体管理器配置文件中添加dql部分来激活扩展。
答案 2 :(得分:1)
使用查询构建器的低技术方法可能是:
class DailyTransactionRepository extends EntityRepository
{
public function getDailyPayment($studentId,$paymentDate)
{
$paymentDate= new \DateTime('2013-03-11');
$nextDate = paymentDate;
$nextDate->modify('+1 day');
$qb = $this->getEntityManager()->createQueryBuilder( 'a' );
$qb->andWhere("a.paymentDate > '$paymentDate'");
$qb->andWhere("a.paymentDate < '$nextDate'");
return $qb->getQuery()->getResult();
}
}
除非绝对必须拥有部分对象,否则您不需要显式选择字段。所有字段都将由实体获取者和设置者提供。