221

Is there a way in a MySQL statement to order records (through a date stamp) by >= NOW() -1 so all records from the day before today to the future are selected?

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
user1092780
  • 2,291
  • 3
  • 15
  • 10

7 Answers7

414

Judging by the documentation for date/time functions, you should be able to do something like:

SELECT * FROM FOO
WHERE MY_DATE_FIELD >= NOW() - INTERVAL 1 DAY
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
79

Be aware that the result may be slightly different than you expect.

NOW() returns a DATETIME.

And INTERVAL works as named, e.g. INTERVAL 1 DAY = 24 hours.

So if your script is cron'd to run at 03:00, it will miss the first three hours of records from the 'oldest' day.

To get the whole day use CURDATE() - INTERVAL 1 DAY. This will get back to the beginning of the previous day regardless of when the script is run.

Hamza Zafeer
  • 2,360
  • 13
  • 30
  • 42
25

Didn't see any answers correctly using DATE_ADD or DATE_SUB:

Subtract 1 day from NOW()

...WHERE DATE_FIELD >= DATE_SUB(NOW(), INTERVAL 1 DAY)

Add 1 day from NOW()

...WHERE DATE_FIELD >= DATE_ADD(NOW(), INTERVAL 1 DAY)
Andrew Atkinson
  • 4,103
  • 5
  • 44
  • 48
  • 1
    Looks "cleaner", somehow, but a bit "heavy" as well. Is there really any added value in explicitly calling a method rather than using a simple addition/substraction ? – Balmipour Sep 03 '20 at 12:26
23

You're almost there: it's NOW() - INTERVAL 1 DAY

Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523
8

Sure you can:

SELECT * FROM table
WHERE DateStamp > DATE_ADD(NOW(), INTERVAL -1 DAY)
Marco Miltenburg
  • 6,123
  • 1
  • 29
  • 29
1

when search field is timestamp and you want find records from 0 hours yesterday and 0 hour today use construction

MY_DATE_TIME_FIELD between makedate(year(now()), date_format(now(),'%j')-1) and makedate(year(now()), date_format(now(),'%j'))  

instead

 now() - interval 1 day
0

try this: SELECT * FROM FOO WHERE MY_DATE_FIELD >= NOW() - INTERVAL '1' DAY