我特别使用MySQL,但我希望有一个跨供应商的解决方案。我使用NOW()函数为每条记录添加一个时间戳作为列。如何查找过去24小时内添加到我的数据库表中的记录?
INSERT INTO messages
(typeId, messageTime, stationId, message)
VALUES
(?, NOW(), ?, ?)
我特别使用MySQL,但我希望有一个跨供应商的解决方案。我使用NOW()函数为每条记录添加一个时间戳作为列。如何查找过去24小时内添加到我的数据库表中的记录?
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));
这应该在便携式的方式工作。
哪个供应商执行此语法工作? – 2008-09-12 16:29:01