1

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

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();

你能纠正我应该如何做吗?

4

1 回答 1

0

最好避免在列值上使用函数的东西,这对 MySQL 性能来说是最好的。例如,

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

完全挫败了使用索引来按时间戳查找记录。它会导致全表扫描,该扫描正常但缓慢。您需要的是一个将生成索引范围扫描的 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。

于 2014-01-17T15:50:52.543 回答