在我的Symfony2存储库中,我希望从调度表中获取已经开始但尚未完成的对象。对象内的间隔应被视为“未完成”,应作为变量传递。
使用普通SQL,它的工作方式如下所示:
SELECT * FROM slots rbs
WHERE rbs.rundate = '2012-08-13'
AND rbs.runtime <= '11:05:00'
AND '11:05:00' <= rbs.runtime + interval '300 seconds'
ORDER BY rbs.rundate DESC, rbs.runtime DESC我能用DQL / Query Builder实现同样的功能吗?
这就是我到目前为止所知道的:
$qb = $this->createQueryBuilder('rbs');
$qb->where(
$qb->expr()->andX(
$qb->expr()->eq('rbs.rundate', ':date'),
$qb->expr()->lte('rbs.runtime', ':time'),
'rbs.runtime + interval 300 seconds >= :time'
)
)
->orderBy('rbs.rundate', 'DESC')
->addOrderBy('rbs.runtime', 'DESC')
->setParameter('date', date('Y-m-d'))
->setParameter('time', date('H:i:s'))但这将返回以下错误:
[Doctrine\ORM\Query\QueryException]
[Syntax Error] line 0, col 139: Error: Expected =, <, <=, <>, >, >=, !=, got '300'我通过Doctrine2 / DQL找到了'interval' is not supported,也提到了here。
对于如何使用Doctrine2的查询构建器或DQL (并将间隔作为变量传递),有什么建议吗?
发布于 2012-08-14 03:05:30
据我所知,Doctrine中没有移植Interval。我发现的解决办法是直接在我作为参数传递的DateTime上工作(在这里,我想使用2天的间隔,通过Datetime传递):
public function findOngoingPublicEvents()
{
return $this->createQueryBuilder('e')
->where('e.isActive = 1')
->andWhere('e.isPublic = 1')
->andWhere('e.begin <= :begin')
->andWhere('e.end >= :end')
->orderBy('e.id', 'ASC')
->setParameter('begin', new \DateTime('+2 days'))
->setParameter('end', new \DateTime('-2 days'))
->getQuery()
->execute();
}发布于 2019-04-11 13:09:03
如果您想在mysql comumn字段上使用INTERVAL (在Doctrine 2,DQL中),您可以按如下方式使用,
$qb->andWhere("DATE_ADD(pv.myDAte,48,'hour') >= UTC_TIMESTAMP()");它将打印SQL,如下所示,
...... DATE_ADD(p0_.appointment_date, INTERVAL 48 HOUR) >= UTC_TIMESTAMP() .....发布于 2019-04-18 20:44:24
@Kiran只写DATE_ADD,但你也可以使用DATE_SUB
$qb->andWhere("DATE(a2_.updatedAt) = DATE_SUB(CURRENT_DATE(), 6, 'day')");它相当于SQL:
DATE(a2_.updatedAt) = DATE_SUB(CURRENT_DATE, INTERVAL 6 DAY)https://stackoverflow.com/questions/11936677
复制相似问题