我特别使用MySQL,但我希望有一个跨供应商的解决方案。我正在使用NOW()函数为每条记录添加时间戳作为列。
INSERT INTO messages
(typeId, messageTime, stationId, message)
VALUES
(?, NOW(), ?, ?)
答案 0 :(得分:4)
SELECT * FROM messages WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY) <= messageTime
答案 1 :(得分:2)
SQL Server查询是:
Select *
From Messages
Where MessageTime > DateAdd(dd, -1, GetDate())
据我所知(未经测试!)MySQL等价物是
Select *
From Messages
Where MessageTime > ADDDATE(NOW(), INTERVAL -1 DAY)
答案 2 :(得分:1)
对于Sybase SQL Anywhere:
Select * From Messages Where MessageTime > dateadd( day, -1, now() )
答案 3 :(得分:1)
对于Oracle
SELECT * FROM messages WHERE messageTime > SYSDATE - 1
(伪变量SYSDATE包含时间,因此sysdate -1将为您提供最后24小时)
答案 4 :(得分:0)
没有跨数据库解决方案,因为它们中的大多数都有自己的日期处理(主要是区间表示)语法和语义。
在PostgreSQL
中,它将是
SELECT * FROM messages WHERE messagetime >= messagetime - interval '1 day'
答案 5 :(得分:0)
如果您是从基于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));
这应该以便携的方式工作。