我有一个PostgreSQL数据库,我在其中存储具有以下行的数据:
------------------------------------------------------
| id | did | sensorid | timestamp | sensor_data | <-- Column names
------------------------------------------------------
| serial | text | int | bigint | jsonb | <-- Data types
------------------------------------------------------
我想为查询提取不超过2天的数据。我尝试过以下方法:
SELECT * FROM datastore
WHERE did = '352204089091070'
AND timestamp > ((NOW() AT TIME ZONE 'UTC') - 172800000);
数据库不包含索引(虽然我希望如此)但由于数据的大小和需要立即创建索引,这不是最好的主意。时间戳值以毫秒(大纪元时间)为单位,因此172800000
等于两天。
问题是我已经浏览了整个数据库并从旧数据创建了元数据,现在我只想查看不超过2天的数据,而不是为每个查询运行整个数据库。
与我当前的查询相比,我预计会有一些性能提升,但是时间戳没有限制,但我只是SELECT
MAX(timestamp)
值:
SELECT id, did, timestamp, sensor_data FROM datastore
WHERE did = 352204089091070
AND sensor_id = 910
AND timestamp = (SELECT MAX(timestamp) FROM datastore
WHERE did = 352204089091070
AND sensor_id = 910)
ORDER BY timestamp DESC
LIMIT 1;
我也尝试将时区投射到BIGINT
,但这似乎也没有。
SELECT * FROM datastore
WHERE did = '352204089091070'
AND timestamp > ((NOW() AT TIME ZONE 'UTC')::BIGINT - 172800000);
可悲的是我只能使用PostgreSQL 9.4而我还没有考虑升级,因为我还不知道它对我的数据库有什么影响。