使用学说查询语言计算出生日期的年龄

时间:2013-02-18 13:35:04

标签: php doctrine-orm zend-framework2 dql

我正在使用Zend Framework 2并使用Doctrine查询语言。

我必须在用户列表页面上添加年龄过滤器。在数据库中,我使用日期格式存储了用户的出生日期。请帮助我如何使用where条件来应用我的过滤器。

$repository = $this->entityManager->getRepository('User\Entity\User');
$query = $repository->createQueryBuilder('u');
$query->where("(DATE_DIFF(CURRENT_DATE(), u.birth_date)/365)=".$search_arr['age']);

此查询未返回任何内容。原因可能是当我在mysql DATEDIFF( CURRENT_DATE( ) , u.birth_date ) /365中运行它时,它返回浮点数,例如10.29。我需要将它转换为整数来进行比较。 Mysql提供 FLOOR 功能,但它在DQL中不起作用。

请帮我解决。

2 个答案:

答案 0 :(得分:0)

以下公式为我做了诀窍:

if (today - 31 <= DOB >= today - 30) i am 30. 

这就是DQL中的样子:

$age = intval($data['age']);

$startDate = new \DateTime('now');
$startDate->modify('-'.($age+1).' years');

$endDate = new \DateTime('now');
$endDate->modify('-'.$age.' years');
$from = new \DateTime($startDate->format("Y-m-d H:i:s"));
$to   = new \DateTime($endDate->format("Y-m-d H:i:s"));

$qb = $this->getEntityManager()->createQueryBuilder();

$qb->select('p');
$qb->from('MyBundle:Person', 'p');
$qb->andWhere('p.dateOfBirth BETWEEN :from AND :to');
$qb->setParameter('from', $from);
$qb->setParameter('to', $to);

答案 1 :(得分:0)

$query->createQueryBuilder('u')->where(':year - substring(u.birthday,1,4) = :age and ((:month = substring(u.birthday,6,2) and :day >= substring(u.birthday,9,2)) or :month > substring(u.birthday,6,2)) or 
        :year - substring(u.birthday,1,4) - 1 = :age and ((:month = substring(u.birthday,6,2) and :day < substring(u.birthday,9,2)) or :month < substring(u.birthday,6,2))')

        ->setParameter('year', (new \DateTime('now'))->format("Y"))
        ->setParameter('month', (new \DateTime('now'))->format("m"))
        ->setParameter('day', (new \DateTime('now'))->format("d"))
        ->setParameter('age', $age);

日期格式Y-m-d