postgresql получить ближайший результат временного шага - PullRequest
0 голосов
/ 04 марта 2020

Я использую Postgres 11, и у меня есть этот запрос:

SELECT start_date 
from connection_history 
where connection_name='myclient' 
 and start_date='2020-03-04 10:46:30';

Но он не улавливает результат, как это выглядит:

         start_date
----------------------------
 2020-03-04 10:46:30.071+00

Как я могу поймать результат без добавления концовки? Я попытался с LIKE, и это не сработало:

SELECT start_date 
from connection_history 
where connection_name='myclient' 
and start_date LIKE '2020-03-04 10:46:30%';
ERROR:  operator does not exist: timestamp with time zone ~~ unknown
LINE 1: ...ection_name='myclient' and start_date LIKE '2020...
                                                             ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

РЕДАКТИРОВАТЬ: Мне нужно что-то вроде этого:

start_date > '2020-03-04 10:46:30' + interval '30 seconds';

РЕДАКТИРОВАТЬ 2:

SELECT start_date 
from connection_history 
where connection_name='myclient' 
and start_date between ('2020-03-04 10:46:30' - interval '30 seconds') 
                   and ('2020-03-04 10:46:30' + interval '30 seconds');
ERROR:  invalid input syntax for type interval: "2020-03-04 10:46:30"
LINE 1: ...me='myclient' and start_date between ('2020-03-0...

Завершено, используя его как ответ:

SELECT start_date from connection_history where connection_name='myclient' and start_date <= timestamp '2020-03-04 10:46:30' + interval '2 seconds';

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Вы можете использовать

start_date between timestamp '2020-03-04 10:46' - interval '30 seconds'
               and timestamp '2020-03-04 10:46' + interval '30 seconds'

Если вы хотите облегчить написание, вы можете создать функцию, которая создает тип диапазона с серединой, являющейся переданной меткой времени вокруг заданного интервал

create function create_range(p_middle timestamp, p_length interval)
  returns tsrange
as
$$
  select tsrange(p_middle - p_length / 2,  p_middle + p_length / 2, '[]');
$$
immutable
language sql;

Затем вы можете сделать следующее:

where start_date <@ create_range(timestamp '2020-03-04 10:46', interval '1 minute');

Однако это не будет использовать индекс (B-Tree) для start_date - если вам это нужно, вам нужно будет использовать синтаксис between.

1 голос
/ 04 марта 2020

Это то, что вы хотите?

 start_date >= '2020-03-04 10:46:30+00' and start_date < '2020-03-04 10:46:31+00'
...