Рассчитать возраст по дате рождения, используя язык запросов доктрины

Я работаю в 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.

Пожалуйста, помогите мне в этом.


person Tayyab Shabab    schedule 18.02.2013    source источник
comment
Пробовали ли вы это решение?   -  person Peon    schedule 18.02.2013
comment
@DainisAbols Я пробовал это решение. Но это дает мне ошибку, что функция FLOOR недоступна в DQL.   -  person Tayyab Shabab    schedule 18.02.2013
comment
Вы должны определить пользовательскую функцию DQL: doctrine-project.org /blog/doctrine2-custom-dql-udfs.html   -  person Ocramius    schedule 18.02.2013


Ответы (2)


Следующая формула помогает мне:

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);
person apfz    schedule 27.02.2016

$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

person Daniel Choi    schedule 12.07.2017