选择时间戳最接近但不迟于现在

时间:2016-01-24 04:32:58

标签: sql postgresql

使用Postgres 9.4,我试图从包含最接近但不在当前系统时间之前的数据的表中选择一行。 datetime列是timestamp without time zone数据类型,数据与服务器位于同一时区。表结构是:

uid |      datetime       |    date    | day |   time   | predictionft | predictioncm | highlow 
-----+---------------------+------------+-----+----------+--------------+--------------+---------
  1 | 2015-12-31 03:21:00 | 2015/12/31 | Thu | 03:21 AM |          5.3 |          162 | H
  2 | 2015-12-31 09:24:00 | 2015/12/31 | Thu | 09:24 AM |          2.4 |           73 | L
  3 | 2015-12-31 14:33:00 | 2015/12/31 | Thu | 02:33 PM |          4.4 |          134 | H
  4 | 2015-12-31 21:04:00 | 2015/12/31 | Thu | 09:04 PM |          1.1 |           34 | L

查询速度不用担心,因为该表包含~1500行。

为清楚起见,如果当前服务器时间为2015-12-31 14:00:00,则返回的行应为3而不是2

编辑: 基于下面接受的答案,解决方案是:

select * 
from myTable
where datetime =
(select min(datetime)
from myTable 
where datetime > now());

编辑2:澄清问题。

3 个答案:

答案 0 :(得分:3)

您也可以使用它。这会更快。但如果你的行数很少,它就不会有太大的不同。

select * from table1
where datetime >= current_timestamp
order by datetime
limit 1

SQLFiddle Demo

答案 1 :(得分:2)

总体思路如下。您可以为postgresql调整它。

select fields
from yourTable
where datetimeField = 
(select min(datetimeField)
from yourTable
where datetimeField > current_timestamp)

答案 2 :(得分:1)

除了给出答案之外的另一种方法是使用窗口函数first_value

select id, first_value(dt) over (order by dt)
  from test
 where dt >= current_timestamp
 limit 1

在此处查看:http://sqlfiddle.com/#!15/0031c/12