给定一个任意的时间戳,比如2014-06-01 12:04:55-04
,我可以在表中找到相邻的两个时间戳。然后使用以下查询计算这两者之间经过的秒数:
SELECT EXTRACT (EPOCH FROM (
(SELECT time AS t0
FROM sometable
WHERE time < '2014-06-01 12:04:55-04'
ORDER BY time DESC LIMIT 1) -
(SELECT time AS t1
FROM sometable
WHERE time > '2014-06-01 12:04:55-04'
ORDER BY time ASC LIMIT 1)
)) as elapsedNegative;
它能够工作,但我想知道是否有其他更优雅或聪明的方法来实现相同的结果?我正在使用9.3版本。这里是一个玩具数据库。
CREATE TABLE sometable (
id serial,
time timestamp
);
INSERT INTO sometable (id, time) VALUES (1, '2014-06-01 11:59:37-04');
INSERT INTO sometable (id, time) VALUES (1, '2014-06-01 12:02:22-04');
INSERT INTO sometable (id, time) VALUES (1, '2014-06-01 12:04:49-04');
INSERT INTO sometable (id, time) VALUES (1, '2014-06-01 12:07:35-04');
INSERT INTO sometable (id, time) VALUES (1, '2014-06-01 12:09:53-04');
感谢任何技巧...
更新 感谢@Joe Love和@Clément Prévost提供的有趣替代方案。过程中学到了很多!
lag()
和lead()
窗口函数可以计算您所需的内容 http://www.postgresql.org/docs/current/static/functions-window.html -- 此外,时间戳差异可以通过其运算符轻松计算(无需多个extract()
调用)http://www.postgresql.org/docs/current/static/functions-datetime.html - pozs