【问题标题】:Idiorm query to get today's records成语查询获取今天的记录
【发布时间】:2014-02-07 00:20:44
【问题描述】:

我一直在玩 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();

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

【问题讨论】:

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

标签: php mysql database date-range idiorm


【解决方案1】:

最好避免在列值上使用函数的东西,以提高 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。

【讨论】:

  • 嗨奥利!谢谢,对于像我这样的数据库新手来说,这是一个非常有用的建议!但不幸的是,我无法解决我的问题。查询没问题,我认为问题出在 Idiorm 的某个地方。这就是我所做的: $events = ORM::for_table('video')->where_lt('time_stamp', 'CURDATE()')->where_gte('time_stamp', 'CURDATE() - INTERVAL 1 DAY')- >find_many();
  • 我对成语了解不多。但也许你应该尝试...-&gt;where_raw('time_stamp &gt;= CURDATE()+ INTERVAL 1 DAY') -&gt;where_raw('time_stamp &lt; CURDATE()' )