2014-01-17 124 views
0

我一直在玩Idiorm,我无法让它从今天和昨天的数据库中获取所有记录。 因此,MySQL的查询是:Idiorm查询得到今天的记录

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

如果我理解正确的,它不能被精确复制了Idiorm,对不对? 我也试过以下选项,这奇怪不工作(返回空数组):

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

能否请您纠正我就应该怎么做?

+0

并使用where_raw,例如 - > where_raw('added_date> NOW() - INTERVAL 24 HOUR') – wesamly

回答

0

对于MySQL性能来说,最好避免使用列值的函数。例如,

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

完全无法使用索引通过time_stamp查找记录。它会导致全表扫描,它可以正常工作,但速度很慢。你想要的是一个将生成索引范围扫描的SQL表达式。这就是说,对于自今天午夜以来的所有time_stamp值。

WHERE time_stamp >= CURDATE() 

如果你想找到从昨天所有TIME_STAMP值,你需要这个SQL语句

WHERE time_stamp >= CURDATE() - INTERVAL 1 DAY 
    AND time_stamp < CURDATE() 
也就是说,要在范围[昨天午夜,今天午夜所有的时间戳

) ,这个范围排除今天午夜。

我认为你的Idiorm代码有CURDATE() - INTERVAL 1 DAY表达式错误。 CURDATE() - 1适用于Oracle,但不适用于MySQL。

+0

嗨Ollie! 谢谢,对于像我这样的db新手来说,这是一条非常有用的建议! 但不幸的是,我无法解决我的问题。查询是好的,我狡猾的问题是在Idiorm的某个地方。这就是我做的: $ events = ORM :: for_table('video') - > where_lt('time_stamp','CURDATE()') - > where_gte('time_stamp','CURDATE() - INTERVAL 1 DAY') - > find_many(); – heuels

+0

我对idiorm不太了解。但是,也许你应该尝试......' - > where_raw('time_stamp> = CURDATE()+ INTERVAL 1 DAY') - > where_raw('time_stamp

+0

非常感谢,它解决了我的问题! – heuels