我特別使用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