如何操纵学说中的日期

时间:2013-09-16 17:51:23

标签: php count doctrine dql

我在我的bd表中有这个日期字段(date_born),这是一个人的出生日期(类型:日期)。

即时通讯使用codeignater,我也使用doctrine。

问题是,我想要计算有多少人是成年人,有多少是孩子,所以我建立了这个:

public function countAdults(){
    $this->qb = $this->em->createQueryBuilder();
    $this->qb->select('count(u)')
            ->from($this->tbl_name, 'u')
            ->where(
                $this->qb->expr()->eq("u.date_born >'1995-01-01'")
                );

    $query = $this->qb->getQuery();
    return $query->getSingleScalarResult();
}

显然,这是一个错误。

我怎样才能以优化的方式重建这个数字来统计1995年以前出生的人? (现在18岁)

2 个答案:

答案 0 :(得分:0)

我推荐以下

  • 使用lte表达式比较日期,而不是使用eq
  • 进行评估
  • 提供PHP的DateTime实例,因为Doctrine很乐意接受它,并且通常更喜欢对象而不是其他任何东西。
  • 要使DateTime的此实例在18年前自动计算出来,这样您就不必每年更改它。
  • 使用setParameters()方法绑定此对象。

方法:

public function countAdults()
{
    $eighteenYearsAgo = new \DateTime();
    $eighteenYearsAgo->modify('-18 years');

    $this->qb = $this->em->createQueryBuilder();
    $this->qb->select('count(u)')
        ->from($this->tbl_name, 'u')
        ->where(
            $qb->expr()->lte('u.date_born', ':date_born'))
        )
        ->setParameters(array(
            'date_born' => $eighteenYearsAgo,
        ))
    ;

    return $this->qb->getQuery()->getSingleScalarResult();
}

答案 1 :(得分:0)

这就是我为前一个问题构建解决方案所做的,

我把这个方法放在我的管理员中:

public function controlAge(){

 $date = new \DateTime();
 $var = $date->format('Y-m-d');
 $dateArray = explode('-', $var);

 $year = strval(($dateArray[0])-(18));
 $month = $dateArray[1];
     $day = $dateArray[2];

 $d = $year.'-'.$month.'-'.$day;
 $newDate = date('Y-m-d', strtotime($d)); 

 return $newDate;
}

根据实际日期计算日期,控制用户是否是成年人(+18),所以当我在学说(在dataservice中)进行咨询时,我只需要做一件简单的事情:发送日期“计算”

public function countAdults($fecha){

 $this->qb = $this->em->createQueryBuilder();               
 $this->qb->select('count(u)')
 ->from($this->tbl_name, 'u')
 ->where('u.date_born <= :var')

     ->setParameter('var', $fecha);
 $query = $this->qb->getQuery();        
 return $query->getSingleScalarResult();    
}