2010-09-08 4 views
0

Если у меня есть таблица с столбцом Date (поле Date), которое называется created_date, с такими значениями, как «9/2/2010 5:25:42 PM».Диапазон дат в PL/SQL

Я хочу выделить все строки от start_date до end_date. Однако end_date может быть null. В этом случае я хочу выбрать все строки, где created_date больше, чем end_date.

+2

Я думаю, что ты хотел сказать "... где created_date больше датой_начала". Вы не можете значимо сравнить created_date с end_date, если end_date имеет значение NULL. –

ответ

9

Поскольку toDate (который может быть нулевым) является переменной-хостом, это проще, чем уже предоставленные решения (все это неверно в этом отношении, кстати)

select * from mytable 
    where created_date between v_fromdate 
         and nvl(v_todate, to_date('31.12.9999','dd.mm.yyyy')); 
0

Почему просто использовать простой SQL-запрос для этого, как это:

select xxx from table_names where created_date is null or (created_date >= to_date("02/09/2010", "dd/mm/yyyy") and created_date <= to_date("03/09/2010", "dd/mm/yyyy")); 

Редактировать

Вы можете определить запрос, как один определенной ammoQ, то есть что-то подобное :

select xxx from table_names where created_date is null or created_date >= start_date and created_date <= nvl(end_date, to_date("31/12/9999", "dd/mm/yyyy")); 

Однако, поскольку вы используете PL/SQL, вы можете проверить недействительность o е end_date параметр:

IF end_date IS NULL THEN 
    select xxx from table_names where created_date is null or created_date >= start_date; 
ELSIF 
    select xxx from table_names where created_date is null or created_date >= start_date and created_date <= end_date; 
END IF; 

Обратите внимание, что вы можете удалить условие created_date is null если created_date не обнуляемый колонок ...

+0

Но я уже упоминал, что на сегодняшний день в этом случае 3 сентября 2010 года может быть null. В этом случае я должен получить все данные> = с даты – Suvonkar

+0

ahh всего несколько секунд быстрее, чем я :) – domiSchenk

+0

@Suvonkar Хорошо, я не получил ваше условие соответствия. Я отредактировал ваш вопрос, а также мой ответ. – romaintaz

0

Если я взял это прямо из вашего вопроса это должно работать:

SELECT * 
FROM yourTable 
WHERE created_date >= to_date('01.09.2010', 'dd.mm.yyyy') 
    AND (end_date <= to_date('02.09.2010', 'dd.mm.yyyy') 
    OR end_date IS NULL); 
0

выберите * из таблицы
где created_date> = '2010-09-02'
и (creat ed_date имеет значение NULL или created_date < = '2010-09-03')

+0

Мне не нравится этот способ сделать это много, так как это приведет к полному сканированию таблицы, даже если есть указатель на created_date. –

+0

BTW, предполагая, что created_date является столбцом даты, ваше решение работает только в том случае, если yyyy-mm-dd является форматом даты по умолчанию. –

+0

Последний комментарий не соответствует действительности, решение будет работать с полным форматом даты «yyyy-MM-dd hh: mm: ss» или «MM/dd/yyyy hh: mm: ss». Сравнение неявно. И да, я протестировал его. –

0
select * from yourtable 
where created_date >= @StartDate AND created_date <=ISNULL(@EndDate,created_date) 
+0

'NVL', а не' ISNULL' - это Oracle. –

0
SELECT * 
    FROM A_TABLE 
    WHERE CREATED_DATE >= &START_DATE AND 
     (CREATED_DATE <= &END_DATE OR 
     &END_DATE IS NULL) 
Смежные вопросы