如何查找过去24小时内添加到数据库表中的记录?

时间:2020-03-05 18:52:21  来源:igfitidea点击:

我特别使用MySQL,但我希望有一个跨供应商的解决方案。我正在使用NOW()函数为每个记录添加时间戳作为列。

INSERT INTO messages 
(typeId, messageTime, stationId, message) 
VALUES 
(?, NOW(), ?, ?)

解决方案

回答

SELECT * FROM messages WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= messageTime

回答

SQL Server查询为:

Select *
From Messages
Where MessageTime > DateAdd(dd, -1, GetDate())

据我所知(未试过!)MySQL等效项是

Select *
From Messages
Where MessageTime > ADDDATE(NOW(), INTERVAL -1 DAY)

回答

没有跨数据库解决方案,因为它们大多数都有自己的日期处理(主要是间隔表示)语法和语义。

PostgreSQL

SELECT * FROM messages WHERE messagetime >= messagetime - interval '1 day'

回答

对于Sybase SQL Anywhere:

Select * From Messages Where MessageTime > dateadd( day, -1, now() )

回答

对于Oracle

SELECT * FROM messages WHERE messageTime > SYSDATE - 1

(伪变量SYSDATE包含时间,因此sysdate -1将为我们提供最近的24小时)

回答

如果我们是从基于API的客户端访问此文件(我猜是这种情况,因为查询中有"?"),则可以从程序中执行此操作,而不是通过SQL。

注意:其余部分用于JDBC语法,其他API /语言将是不同的语法,但在概念上应相同。

在插入侧

PreparedStatement stmt = connection.prepareStatement( 
    "INSERT INTO messages " +
    "(typeId, messageTime, stationId, message) VALUES " +
    "(?, ?, ?, ?)" );
stmt.setInt(1, typeId);
stmt.setDate(2, new java.sql.Date(System.currentTimeMillis()));
stmt.setInt(3, stationId);
stmt.setString(4, message);

在查询方面,请执行以下操作:

PrepatedStatement stmt = connection.prepareStatement(
   "SELECT typeId, messageTime, stationId, message " +
   "from messages where messageTime < ?");
long yesterday = System.currentTimeMillis() - 86400000; // 86400 sec/day
stmt.setDate(1,new java.sql.Date(yesterday));

那应该以可移植的方式工作。