Внутри базы данных не имеет значения, является ли дата "DD Mon YY" или "YYYY-MM-DD HH24: MI: SS". Это просто форматирование, и фактическое значение этой даты будет таким же. Так что, если обе «даты» на самом деле имеют тип данных date
, то вы можете просто использовать что-то вроде:
....
AND (
(
main_query.schd_compare >= NVL(pv_task_sch_st_date,main_query.schd_compare)
)
AND
(
main_query.schd_compare <= NVL(pv_task_sch_end_date,main_query.schd_compare)
)
)
Это если ваши pv_task_sch_???_date
передаются как NULL
значения, когда они не выбраны. Похоже, что Oracle действительно обрабатывает пустые строки и NULL
то же самое в подобных сравнениях, но вам будет трудно отлаживать, если вы привыкнете полагаться на то, что NULL
и ''
одинаковы.
Что касается вашего запроса, я предполагаю, что ваши pv_task...
значения фактически передаются вашему запросу в виде некой строки. Если это так, то вам нужно поместить TO_DATE()
вокруг ваших pv_task...
переменных.
Взгляните на https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=2066b2005a22769e785815f6b03750a1. Я рассмотрел несколько примеров того, как можно относиться к вашим датам.
Я уже говорил ранее, что базе данных не важно, в каком формате находится ваша дата. И она сохраняется одинаково, независимо от формата. Но когда вы используете TO_DATE()
или другие подобные функции, Oracle хочет, чтобы вы указали правильную маску ваших данных. Если вы отправите «01 января 99» на TO_DATE()
, Oracle необходимо знать, как интерпретировать это значение. Таким образом, вы говорите, что строка "DD Mon YY". Вы не можете сделать TO_DATE('2018-09-10','YYYY-MM-DD HH24:MI:SS')
, потому что мои данные не содержат компонент времени. (я бы также предостерег от использования двухзначных лет.)
Кстати, я ненавижу свидания. И работа с датами в Oracle усиливает эту ненависть.