#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.