【发布时间】:2010-09-08 17:37:55
【问题描述】:
我特别使用 MySQL,但我希望有一个跨供应商的解决方案。我正在使用 NOW() 函数将时间戳添加为每条记录的列。
INSERT INTO messages
(typeId, messageTime, stationId, message)
VALUES
(?, NOW(), ?, ?)
【问题讨论】:
标签: sql
我特别使用 MySQL,但我希望有一个跨供应商的解决方案。我正在使用 NOW() 函数将时间戳添加为每条记录的列。
INSERT INTO messages
(typeId, messageTime, stationId, message)
VALUES
(?, NOW(), ?, ?)
【问题讨论】:
标签: sql
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() )
【讨论】:
对于甲骨文
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));
这应该以可移植的方式工作。
【讨论】: