Oracle как получить данные для сегодняшней даты, которая сохраняется как временная метка времени

#sql #oracle #jpa #spring-data-jpa

#sql #Oracle #jpa #spring-data-jpa

Вопрос:

У меня есть поле даты EXECUTION_START в таблице базы данных с именем TRANSACTION.

Я сохраняю в таблице, используя JPA как,

 @Temporal(TemporalType.TIMESTAMP)   
private Date EXECUTION_START;
  

Значения, хранящиеся в базе данных, представлены в этом формате «18.08.2020, 14:29:08».

Как написать запрос для получения данных для сегодняшней даты?

 select * from TRANSACTION where EXECUTION_START = SYSDATE;
select * from TRANSACTION where EXECUTION_START = to_date('08/18/2020','mm/dd/yyyy');
  

РЕДАКТИРОВАТЬ — Запрос к БД, предложенный @Littlefoot, работает.

 select * from TRANSACTION where trunc(EXECUTION_START) = trunc(SYSDATE);
  

Но когда я использую это в моем новом запросе JPA, происходит сбой,

 @Query("SELECT txn FROM Transaction txn WHERE txn.JOB_NAME = :jobName AND TRUNC(txn.EXECUTION_START) = :TRUNC(SYSDATE) and txn.STATUS = 'RUNNING'")
public Transaction getTransactionByJobName(@Param("jobName") String jobName);
  

Получение приведенной ниже ошибки,

 line 1:135: unexpected token: (
line 1:136: unexpected token: SYSDATE
line 1:143: expecting EOF, found ')'
  

Я не получаю правильный вывод с помощью приведенных выше запросов.

Также я написал свой запрос JPA, как показано ниже,

 @Query("SELECT txn FROM TRANSACTION txn WHERE txn.NAME = :name AND txn.EXECUTION_START = :SYSDATE")
public Transaction getTransactionByName(@Param("name") String name);
  

Ответ №1:

Если тип данных execution_start столбца date , он содержит как дату, так и время. Мы, люди, не можем прочитать их формат — вот почему мы используем to_char функцию и маску желаемого формата, чтобы отобразить их так, как мы хотим.

Но, если вы собираетесь выбрать значения, которые зависят от этого столбца, то: поскольку sysdate это функция, которая возвращает date тип данных (читай: и дату, и время, установленные на «прямо сейчас» (в соответствии со временем на сервере базы данных), значения, хранящиеся в этом столбце, вряд ли будут равны этому значению.

Что мы обычно делаем, это «удаляем» компонент времени, усекая значение; это, фактически, устанавливает время на 00:00 в начале этой даты. Это означает, что что-то вроде этого может выполнить эту работу:

 select * from TRANSACTION where trunc(EXECUTION_START) = trunc(SYSDATE);
  

Обратите внимание, что он не будет использовать индекс в execution_start столбце (если он существует); это может быть «исправлено», но — давайте попробуем, работает ли это вообще.

Комментарии:

1. Спасибо за ответ @Littlefoot . Запрос выдает желаемый результат, но теперь я застрял с запросом JPA. Как использовать trunc в запросе JPA??

2. Извините, я бы не знал, я не использую JPA.