Java Spring / Pg SQL операция с меткой времени возвращает интервал - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь получить данные в пределах интервала времени на Java Spring, используя базу данных Postgresql. Один из запросов, которые я использую, работает просто отлично (возвращает данные за последние 24 часа):

  @Query(value = "SELECT timestamp,lettura,stato FROM dati_impianti 
WHERE sigla_impianto = :impianto and timestamp > now() - interval '24 hours' 
ORDER BY timestamp DESC", nativeQuery = true)
  List<ReadingEntity> findLastDay(@Param("impianto") String s);

Однако, когда я пытаюсь вернуть данные с другой отметкой времени, я получаю PSQL исключение:

 @Query(value = "SELECT timestamp,lettura,stato FROM dati_impianti 
WHERE sigla_impianto = :impianto and timestamp > :timestamp - interval '24 hours' 
ORDER BY timestamp DESC", nativeQuery = true)
  List<ReadingEntity> findDate(@Param("impianto") String s, @Param("timestamp") Timestamp t);

И это исключение, которое я получаю:

org.postgresql.util.PSQLException: ERROR: operator does not exist: timestamp without time zone > interval
No operator matches the given name and argument types. You might need to add explicit type casts.

Что я не могу понять, так это то, что, согласно документации PostgreSQL, timestamp - интервал должен возвращать другую timestamp . Однако из моего запроса кажется, что я сравниваю отметку времени (из таблицы) с интервалом , что неверно. Если я попытаюсь напрямую использовать свой параметр метки времени (в виде отметка времени>: отметка времени без сокращения его на интервал), это сработает, но это не то, что я искал.

I также пытался явным образом привести приведение, используя : timestamp :: timestamp , но, похоже, это приводит к другому типу ошибки из-за Spring и способа обработки параметров.

1 Ответ

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

Возможно, вы захотите попробовать явно привести ваш параметр к timestamp:

where 
    sigla_impianto = :impianto 
    and timestamp > :timestamp::timestamp - interval '24 hours'

Или, возможно:

where 
    sigla_impianto = :impianto 
    and timestamp > cast(:timestamp as timestamp) - interval '24 hours'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...