我在我的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岁)
答案 0 :(得分:0)
我推荐以下
lte
表达式比较日期,而不是使用eq
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();
}