Я предпочитаю второе также, но у меня нет рациональных аргументов в это время для поддержания той позиции.
Как насчет попытки:
select * from 'test_table'
where end_date < CAST('2009-12-15' AS DATE)
or start_date > CAST('2010-01-02' AS DATE)
, который вернет все диапазоны дат, которые вообще не перекрывают ваш диапазон дат.
То, что вы сейчас делаете, проверяет, не попадают ли ни start_date, ни end_date в диапазон указанных дат.
Я полагаю, что вы действительно ищете запись, которая не соответствует указанному диапазону дат. Если да, используйте запрос ниже.
SELECT *
FROM `test_table`
WHERE CAST('2009-12-15' AS DATE) > start_date AND CAST('2010-01-02' AS DATE) < end_date
Предполагая, что start_date раньше end_date,
interval [start_date..end_date] NOT BETWEEN две даты просто означает, что либо он начинается до 15 декабря 2009 г., либо заканчивается после 01.01.2010. -02.
Затем вы можете просто выполнить
start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)
Ваша логика обратная.
SELECT
*
FROM
`test_table`
WHERE
start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)
AND end_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)
Вы имеете в виду, что диапазон дат выбранных строк не должен лежать полностью в пределах указанного диапазона дат? В этом случае:
select *
from test_table
where start_date < date '2009-12-15'
or end_date > date '2010-01-02';
(Синтаксис выше для Oracle, ваш может немного отличаться).
Для перекрытия start_date таблицы должен быть МЕНЬШЕ даты окончания интервала (т.е. он должен начинаться до конца интервала) И end_date таблицы должен быть БОЛЬШЕ, ЧЕМ дата начала интервала. Возможно, вам придется использовать <= и> = в зависимости от ваших требований.