选择时间戳在当前小时的位置

时间:2015-05-14 21:50:25

标签: php mysql

我制作一个每小时运行一次的cronjob,检查数据库中是否有当前时间内的时间戳字段。

即。如果脚本在13:00运行,并且有一个13:45的时间戳字段,它将找到它。

目前,我正在考虑使用当前日期获取所有时间戳,然后从当时获得前2个字符并将其与当前时间进行比较,但我希望有更多的内置时间这样做的方法?

3 个答案:

答案 0 :(得分:2)

作为其标记的mysql我只能猜测一个SQL查询:

SELECT foo from bar WHERE HOUR(your_time_field) = HOUR(CURTIME()) AND DATE(field) = CURDATE() 

Mysql函数:

  • HOUR =从日期返回小时
  • NOW()返回当前日期的时间CURDATE()当前日期没有时间

答案 1 :(得分:1)

以下看起来有点复杂,但实际上这是一个很好的方法:

where field >= FROM_UNIXTIME(floor(UNIX_TIMESTAMP(now()) / (60 * 60))) and
      field < date_add(FROM_UNIXTIME(floor(UNIX_TIMESTAMP(now()) / (60 * 60))), interval 1 hour)

复杂的表达式正在做的是找到当前和下一个小时的开始。这种方法的优点是它可以利用field上的索引(如果有的话)。这会阻止全表扫描以获取更新的数据。

答案 2 :(得分:0)

$from = '2015-05-14 13:00:00';
$to = '2015-05-14 13:59:59';
. . .
"select * from users where created_at between $from and $to"

您应该忽略&#34; created_at&#34;的所有操作,例如&#34; hour(created_at)&#34;因为它会显着减慢查询的执行速度,因为引擎必须对循环中的所有记录应用此操作。此外,如果您有索引,则更有可能被忽略。

例如,您可以使用以下方式获取当前小时的记录:

select * from users where created_at between date_format(now(), '%Y-%m-%d %H:00:00') and date_format(now(), '%Y-%m-%d %H:%i:%s')

MySQL非常聪明,可以计算&#34;&#34;之间的2个值。只有一次;还&#34; created_at&#34;它没有任何函数包装器,因此如果索引此字段,将使用索引。