Question

I have been playing around with Idiorm and I couldn't make it get all of the records from the database for today and yesterday. So, the MySQL queries are:

SELECT * FROM `video` WHERE DATE(`time_stamp`) = CURDATE()    # today
SELECT * FROM `video` WHERE DATE(`time_stamp`) = CURDATE() -1 # yesterday

If I understand correctly, it cannot be exactly reproduced for Idiorm, right? I also have tried the following option, which strangely did not work (returns empty array):

$today = ORM::for_table('video')->
        where_lt('time_stamp', 'CURDATE()')->
        where_gte('time_stamp', 'CURDATE()-1')->find_many();

Can you please correct me on how it should be done?

Was it helpful?

Solution

It's best for MySQL performance to avoid stuff that uses functions on column values. For example,

WHERE DATE(time_stamp) = CURDATE()   /* slow! */

completely defeats the use of an index to look up records by time_stamp. It causes a full-table scan, which works correctly but slowly. What you want is an SQL expression that will generate an index range scan. This does that, for all time_stamp values since midnight of today's date.

WHERE time_stamp >= CURDATE()

If you want to find all the time_stamp values from yesterday, you need this SQL statement

WHERE time_stamp >= CURDATE() - INTERVAL 1 DAY
  AND time_stamp <  CURDATE()

That is, you want all the time stamps in the range [yesterday midnight, today midnight), which range excludes today midnight.

I think your Idiorm code has the CURDATE() - INTERVAL 1 DAY expression wrong. CURDATE() - 1 works in Oracle, but not in MySQL.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top