Как создать запрос для известного значения в известном поле, с известной датой между 2 неизвестными датами) - PullRequest
1 голос
/ 20 сентября 2019

Задача - найти известное значение в указанном поле.Условие: есть системная дата или дата, которую я хочу использовать.Эта дата должна быть между 2 датами (полями, в которых даты известны), то есть вам необходимо проверить все даты в базе данных, + дополнительное условие:

необходимо, чтобы найденная строка имелаСамо по себе ранее известное поле, помеченное IS NULL

Код, написанный на Sql, ниже работает.

select b.* from nc_proc b where b.code_proc = 'S.2.2' and b.date_on >= '12-AUG-19' and  b.d_off  IS NULL  and b.date_off > '12-AUG-19';

'12 -AUG-19 '- это переменная, которая отправляется мне (точнееЯ формирую это из системного времени)

'S.2. 2 '- это переменная, которую я получаю и которая является основным поиском.

Как сделать запрос?

вот пример, который пытался сделать

@Query(value = "SELECT b.* FROM nc_proc b WHERE b.code_proc = ?1 and b.date_on  > ?2 and  b.d_off  IS NULL  and b.date_off > ?2 ", nativeQuery = true)
List <NcProc> findByCodeProcList2 (String value, String systemDate);

Это не работает.

Пожалуйста, скажите мне, как это исправить.И возможно ли не использовать запрос вручную, а делать со встроенными ключевыми словами пружинные данные?Тогда этот вариант будет лучше.

Обновление

@Query(value = "SELECT b.* FROM nc_proc b WHERE b.code_proc = ?1 and ?2 b.date_on BETWEEN b.date_off and  b.d_off  IS NULL", nativeQuery = true)
    List <NcProc> findByCodeProcList2 (String value, String systemDate);

Hibernate: ВЫБРАТЬ b. * ОТ nc_proc b ГДЕ b.code_proc =?а также ?b.date_on МЕЖДУ b.date_off и b.d_off IS NULL 11: 02: 58: 871 ПРЕДУПРЕЖДЕНИЕ http-nio-8080-exec-1 ohejsSqlExceptionHelper: 137 - Ошибка SQL: 920, SQLState: 42000 19-сентября-20 11:02: 58: 871 ОШИБКА http-nio-8080-exec-1 ohejsSqlExceptionHelper: 142 - ORA-00920: недопустимый реляционный оператор

Кроме того, мне сказали, что МЕЖДУ включаетлевое и правое ограничение, и необходимо, чтобы требуемая дата была в указанном интервале и не равнялась левому и правому ограничению.

Обновление

это работа

 @Query(value = "select * from nc_proc where code_proc = ?1 " +
        "and date_on <= TO_DATE(?2, 'yyyy-mm-dd HH24:MI:SS') " +
        "and TO_DATE(?2, 'yyyy-mm-dd  HH24:MI:SS ') < date_off " +
        "and d_off IS NULL",
        nativeQuery = true)
  NcProc findByCodeProc(String codeProc, String systemDate);

Я хотел не использовать нативную запись в будущем.

Кто знает, как составить выражение из ключевых слов spring-data?

1 Ответ

0 голосов
/ 20 сентября 2019

Я не могу помочь со стороны Spring, но для ваших запросов я думаю, что вы хотите что-то вроде:

SELECT b.* FROM nc_proc b WHERE b.code_proc = ?1 AND b.date_on > ?2 AND b.date_off < ?2 AND b.d_off IS NULL

Из вашего вопроса неясно, идут ли даты b.date_on > '12-AUG-19' > b.date_off или наоборотb.date_on < '12-AUG-19' < b.date_off.Поэтому вам, возможно, придется переключить операторы> <. </p>

...