2016-12-03 4 views
0

Я использую PostgreSQL 9.5 и у меня есть таблица вроде этого:Ближайшие даты и времени для PostgreSQL 9.5

CREATE TABLE tracks ( 
    track    bigserial NOT NULL, 
    time_track   timestamp, 
    CONSTRAINT pk_aircraft_tracks PRIMARY KEY (track) 
); 

Я хочу, чтобы получить трек для ближайшего значения DateTime с помощью SELECT, оператора. например, если у меня есть:

track datatime 
    1 | 2016-12-01 21:02:47 
    2 | 2016-11-01 21:02:47 
    3 |2016-12-01 22:02:47 

Для ввода datatime 2016-12-01 21:00, трек 2.

Я foud из Is there a postgres CLOSEST operator? подобного Queston для целого числа. Но она не работает с datatime или PostgreSQL 9.5:

SELECT * FROM 
(
    (SELECT time_track, track FROM tracks WHERE time_track >= now() ORDER BY time_track LIMIT 1) AS above 
    UNION ALL 
    (SELECT time_track, track FROM tracks WHERE time_track < now() ORDER BY time_track DESC LIMIT 1) AS below 
) 
ORDER BY abs(?-time_track) LIMIT 1; 

Ошибка:

ERROR: syntax error at or near "UNION" 
LINE 4: UNION ALL 
+0

'AS above' и' AS ниже 'является избыточным. – Abelisto

ответ

1

Track 1 расположен ближе всего к '2016-12-01 21:00':

with tracks(track, datatime) as (
values 
    (1, '2016-12-01 21:02:47'::timestamp), 
    (2, '2016-11-01 21:02:47'), 
    (3, '2016-12-01 22:02:47') 
) 

select * 
from tracks 
order by 
    case when datatime > '2016-12-01 21:00' then datatime - '2016-12-01 21:00' 
    else '2016-12-01 21:00' - datatime end 
limit 1; 

track |  datatime  
-------+--------------------- 
    1 | 2016-12-01 21:02:47 
(1 row) 
Смежные вопросы