How to use the expression mysql NOW() in doctrine querybuilder?
Asked
Active
Viewed 3.1k times
2 Answers
53
In Doctrine2 you have to use one of the following instead of NOW()
.
This:
CURRENT_TIMESTAMP()
Or:
...
createQuery(...'WHERE x.date = :now')
->setParameter('now', new \DateTime('now'))
...
If you want only time or only date use one of those:
CURRENT_TIME()
and CURRENT_DATE()

Benoit Esnard
- 2,017
- 2
- 24
- 32

Mats Rietdijk
- 2,576
- 3
- 20
- 25
-
Documentation link reports not found, please update. – wesamly Oct 25 '14 at 08:24
-
1This CURRENT_TIMESTAMP() thing has never has worked for me. Could you provide an example of how that is used? I don't wan't to use the web server's time, rather the database. I always end up writing raw SQL (still binding params) and forgoing the query builder. – ficuscr Feb 09 '15 at 08:07
-
4Also notice `'now'` is default param for `DateTime`, so `new \DateTime()` is enough. – Jan Mares Jul 28 '16 at 15:17
9
Using query builder it would look like this:
$qb
->select('B')
->from('RandomBundle:Banana', 'B')
->where(
$qb->expr()->gt('B.expiresAt', ':now')
)
->setParameter('now', '\'CURRENT_TIMESTAMP()\'');
Note: extra quotes on parameter set is required to get CURRENT_TIMESTAMP()
function working.
Or simply
$qb
->select('B')
->from('RandomBundle:Banana', 'B')
->where(
$qb->expr()->gt('B.expiresAt', 'CURRENT_TIMESTAMP()')
);

Aistis
- 3,695
- 2
- 34
- 34
-
In the second example, you can use the shorter `B.expiresAt > CURRENT_TIMESTAMP()` comparison directly inside the `where` call instead of using a query builder expression – Clamburger Dec 31 '15 at 15:02
-
I assume it was desired to use database's time, not some frontend web server's. Alternate options are to use a [resultset mapper/native query](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html), or to extend Doctrine and write your own Doctrine\ORM\Query\AST\Functions. – ficuscr Oct 03 '17 at 19:58