首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Doctrine2查询构建器中使用“interval”

如何在Doctrine2查询构建器中使用“interval”
EN

Stack Overflow用户
提问于 2012-08-13 22:45:44
回答 4查看 16.2K关注 0票数 11

在我的Symfony2存储库中,我希望从调度表中获取已经开始但尚未完成的对象。对象内的间隔应被视为“未完成”,应作为变量传递。

使用普通SQL,它的工作方式如下所示:

代码语言:javascript
复制
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实现同样的功能吗?

这就是我到目前为止所知道的:

代码语言:javascript
复制
$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'))

但这将返回以下错误:

代码语言:javascript
复制
[Doctrine\ORM\Query\QueryException]                                                 
[Syntax Error] line 0, col 139: Error: Expected =, <, <=, <>, >, >=, !=, got '300'

我通过Doctrine2 / DQL找到了'interval' is not supported,也提到了here

对于如何使用Doctrine2的查询构建器或DQL (并将间隔作为变量传递),有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-14 03:05:30

据我所知,Doctrine中没有移植Interval。我发现的解决办法是直接在我作为参数传递的DateTime上工作(在这里,我想使用2天的间隔,通过Datetime传递):

代码语言:javascript
复制
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();
}
票数 17
EN

Stack Overflow用户

发布于 2019-04-11 13:09:03

如果您想在mysql comumn字段上使用INTERVAL (在Doctrine 2,DQL中),您可以按如下方式使用,

代码语言:javascript
复制
$qb->andWhere("DATE_ADD(pv.myDAte,48,'hour') >= UTC_TIMESTAMP()");

它将打印SQL,如下所示,

代码语言:javascript
复制
...... DATE_ADD(p0_.appointment_date, INTERVAL 48 HOUR) >= UTC_TIMESTAMP() .....
票数 7
EN

Stack Overflow用户

发布于 2019-04-18 20:44:24

@Kiran只写DATE_ADD,但你也可以使用DATE_SUB

代码语言:javascript
复制
$qb->andWhere("DATE(a2_.updatedAt) = DATE_SUB(CURRENT_DATE(), 6, 'day')");

它相当于SQL:

代码语言:javascript
复制
DATE(a2_.updatedAt) = DATE_SUB(CURRENT_DATE, INTERVAL 6 DAY)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11936677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档