28

I have a Symfony2 application with a table that contains a date field, whose type is DateTime.
I need to get all the entities where that field value is now.

If I uses the following code, I get 0 results because Doctrine is comparing the DateTime object.

$now = new \DateTime(); data = $entityRepository->findByDate($now); 

I need to only compare year, month, and day, not hours.

How can I achieve this?

3 Answers 3

68

I see this simple way:

$now = new \DateTime(); $data = $entityRepository->getByDate($now); 

then in your repository

public function getByDate(\Datetime $date) { $from = new \DateTime($date->format("Y-m-d")." 00:00:00"); $to = new \DateTime($date->format("Y-m-d")." 23:59:59"); $qb = $this->createQueryBuilder("e"); $qb ->andWhere('e.date BETWEEN :from AND :to') ->setParameter('from', $from ) ->setParameter('to', $to) ; $result = $qb->getQuery()->getResult(); return $result; } 
Sign up to request clarification or add additional context in comments.

2 Comments

When you are ready to move to the next coding level, you guys could read this article about value object and time precision. rosstuck.com/…
you can also use SQL DATE() function following the steps in this excellent answer to a similar question: stackoverflow.com/a/25999716/4954580
5

Method in repository

public function getDays(\DateTime $firstDateTime, \DateTime $lastDateTime) { $qb = $this->getEntityManager()->createQueryBuilder() ->select('c') ->from('ProjectBundle:Calendar', 'c') ->where('c.date BETWEEN :firstDate AND :lastDate') ->setParameter('firstDate', $firstDateTime) ->setParameter('lastDate', $lastDateTime) ; $result = $qb->getQuery()->getResult(); return $result; } 

And action

public function calendarAction() { $currentMonthDateTime = new \DateTime(); $firstDateTime = $currentMonthDateTime->modify('first day of this month'); $currentMonthDateTime = new \DateTime(); $lastDateTime = $currentMonthDateTime->modify('last day of this month'); $days = $this->getDoctrine() ->getRepository('ProjectBundle:Calendar') ->getDays($firstDateTime, $lastDateTime); return ['days' => $days]; } 

Comments

2

There is a difference between the date and datetime types in doctrine.

date: Type that maps a SQL DATETIME to a PHP DateTime object.

datetime: Type that maps a SQL DATETIME/TIMESTAMP to a PHP DateTime object.

Make sure you have set the column type to date instead of datetime.

Alternatively - as a workaround - you could get the day from the original date1 and then search between a same-day date2 -> 00:00:00 and same-day date3 -> 23:59:59 using a custom repository method.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.