获取最近一小时添加的行

65

我在一张表中记录了登录信息,有id、ip、日期和时间这些列。现在,我想获取最近一小时内的登录记录。

我已经查阅了MySQL文档上关于时间和日期函数的内容,但是我似乎无法正确地将它们组合起来。

能有人帮我吗?


1
这是四列还是三列,"日期和时间"的数据类型是什么? - OMG Ponies
现在已更改,只有一个日期和时间列 - 它是datetime。 - Michael Grons
6个回答

179

使用DATE_SUB()NOW()函数:

select count(*) as cnt
from  log
where date >= DATE_SUB(NOW(),INTERVAL 1 HOUR); 

希望这能对您有所帮助 :)


是的,我做过类似的事情,只不过使用了TIMESUB(或SUBTIME?)。但是这是否需要日期字段是datetime类型呢? - Michael Grons
是的,使用TIMESUB更合适。是的,第一个表达式必须是一个日期时间表达式。第二个表达式应该是一个时间表达式。请查看这个链接:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_subtime - SDReyes
4
保存数据时使用协调世界时(UTC)时间,需使用UTC_TIMESTAMP()函数而非NOW()函数。 - Alex Poca
这对于快速查询非常有效,但如果您想确保准确获取数据,则可能会有些棘手。例如,如果我有一个每小时运行一次的脚本,我不能只说获取最近一小时的数据,因为脚本启动时间可能会有轻微的变化。因此,我必须将时间范围设置为从13:00:00到13:59:59,而不是在下午2点时使用date > 1小时前。 - phoenix

14

如果您想将此功能实现到cronjob中,您需要指定开始和结束时间。

例如,如果您想在下午2点获取过去一小时的数据,从13:00:00到13:59:59,请按照以下步骤操作:

dateField BETWEEN 
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 HOUR), '%Y-%m-%d %H:00:00') 
AND 
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 HOUR), '%Y-%m-%d %H:59:59')

8

使用以下方法可以轻松完成:

select count(*) from logins where datetime>= NOW()- INTERVAL 1 HOUR

4

我建议您使用一个日期时间列而不是分别使用日期和时间列。

假设您有一个名为last_login的日期时间列:

SELECT id, ip_address, last_login
FROM mytable
WHERE last_login >= DATE_SUB(NOW(), interval 1 hour);

如果需要打印特定日期的日期,该怎么办?我不想获取前一天的日期,而只想获取当天的日期。你能帮我吗? - Sap

0

不涉及具体细节,我认为 Date_Add() 可以解决问题。通过在 where 子句中添加 NOW 负数小时的 add,即可实现。

(或者使用 Date_Sub() )


0

您也可以使用CURDATE()函数

SELECT
    count(*) AS TotalCount
FROM
    tblName
WHERE
    datetime >= DATE_SUB(CURDATE(), INTERVAL 1 HOUR)

不行。那会给出前一天最后一个小时的数据。 - yeya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接