2016-04-29 44 views
-1

我想要做的是在给定月份的数据库中获取所有日期。“where”子句只有月份

我尝试了多种解决方案,但都没有工作。我以教条(有点)做黑魔法而告终。

这是我最后一次尝试:

public function getNbCongesByMonth($month){ 
    $listOfEntities = $this->createQueryBuilder('e') 
     ->select('count(e) as nb, SUBSTRING(e.cngDateDebut, 6, 2) as day') 
     ->where('day = :month') 
     ->setParameter('month', $month) 
     ->getQuery() 
     ->getResult(); 
    return $listOfEntities; 
} 

请求应该返回数据库“Conges”的量精确的一个月。

有了这个请求,我得到这个错误:

An exception occurred while executing 'SELECT count(c0_.CNG_ID) AS sclr0, SUBSTRING(c0_.CNG_DATE_DEBUT FROM 6 FOR 2) AS sclr1 FROM Conges c0_ WHERE sclr1 = ?' with params ["5"]: 

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sclr1' in 'where clause' 

我没有任何想法如何做到这一点了,所以如果有人有一个解决方案,将是真棒。

在此先感谢。

+0

你能解释为什么downvote?我是新来的,我做错了什么? –

+0

我猜cngDateDebut是一个日期时间,因此您可以只与另一个DateTime对象进行比较,而不是与一个字符串,这将永远不会工作 – Nickolaus

+0

这样的查询是不可能的,你不能使用列别名)在where子句中,从不。这是因为在任何SQL数据库引擎中where子句都是在select子句之前处理的。我建议打开新的questiton,在那里你把你的数据库模型,并把例子你想获得什么数据,也许有人可以给你写一个查询。 – Miro

回答

1

如果使用datetime类型为cngDateDebut属性,可以使用基于由MySQL使用的YYYY-MM-DD HH:MM:SS格式like()条件:

public function getNbCongesByMonth($month){ 
    $qb = $this->createQueryBuilder('e'); 

    $listOfEntities = $qb 
     ->select('count(e) as nb') 
     ->where(
      $qb->expr()->like('e.cngDateDebut', 
       $qb->expr()->literal('%-'.$month.'-%') 
      ) 
     ) 
     ->getQuery() 
     ->getResult(); 
    return $listOfEntities; 
} 

如果你想只计算天客对于给定从给定年月:

public function getNbCongesByMonth($year, $month){ 
    $qb = $this->createQueryBuilder('e'); 

    $listOfEntities = $qb 
     ->select('count(e) as nb') 
     ->where(
      $qb->expr()->like('e.cngDateDebut', 
       $qb->expr()->literal($year.'-'.$month.'-%') 
      ) 
     ) 
     ->getQuery() 
     ->getResult(); 
    return $listOfEntities; 
} 

%是匹配任何一个关键字,所以用$month = 04'%-'.$month.'-%'的格局将是'%-04-%',这种模式将匹配2016-04-…',2015-04-…'

+1

这完全是我想要的。现在我只需要做一些调整以适应我的项目,但是如果没有你,我永远也找不到如何去做。谢谢 –