Sql 选择时间戳最接近但不晚于现在的行
使用Postgres9.4,我试图从包含最接近但不早于当前系统时间的数据的表中选择一行。Sql 选择时间戳最接近但不晚于现在的行,sql,postgresql,Sql,Postgresql,使用Postgres9.4,我试图从包含最接近但不早于当前系统时间的数据的表中选择一行。datetime列是一个不带时区的时间戳数据类型,数据与服务器位于同一时区。表格结构为: uid | datetime | date | day | time | predictionft | predictioncm | highlow -----+---------------------+------------+-----+----------+------
datetime
列是一个不带时区的时间戳
数据类型,数据与服务器位于同一时区。表格结构为:
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:澄清问题。总体思路如下。您可以针对postgresql对其进行调整
select fields
from yourTable
where datetimeField =
(select min(datetimeField)
from yourTable
where datetimeField > current_timestamp)
总体思路如下。您可以针对postgresql对其进行调整
select fields
from yourTable
where datetimeField =
(select min(datetimeField)
from yourTable
where datetimeField > current_timestamp)
你也可以用这个。这会更快。但是如果你排的很少,那就没什么区别了
select * from table1
where datetime >= current_timestamp
order by datetime
limit 1
您也可以使用此功能。这会更快。但是如果你排的很少,那就没什么区别了
select * from table1
where datetime >= current_timestamp
order by datetime
limit 1
除了给出的答案之外,另一种方法是使用窗口函数
第一个值
select id, first_value(dt) over (order by dt)
from test
where dt >= current_timestamp
limit 1
在这里查看它的工作情况:除了给出的答案之外,另一种方法是使用窗口函数
first\u value
select id, first_value(dt) over (order by dt)
from test
where dt >= current_timestamp
limit 1
看到它在这里工作了吗:上下都离得最近吗?我的意思是,如果有一个列显示为
2015-12-31 13:59:00
,那么它将被选中?Jorge-否,在所有情况下,查询都应选择将来的行或与当前时间完全相等的行。您可以说早于
,不晚于问题中的行。但在此注释中,在
之后是。请更正这个问题。上下两个都是最近的吗?我的意思是,如果有一个列显示为2015-12-31 13:59:00
,那么它将被选中?Jorge-否,在所有情况下,查询都应选择将来的行或与当前时间完全相等的行。您可以说早于
,不晚于问题中的行。但在此注释中,在
之后是。请纠正这个问题。