SQL-запрос не между двумя датами
мне нужна помощь с SQL-запрос.
Я пытаюсь выбрать все записи из таблицы test_table
который не будет соответствовать между двумя датами "2009-12-15" и "2010-01-02".
Это моя структура таблицы:
`start_date` date NOT NULL default '0000-00-00',
`end_date` date NOT NULL default '0000-00-00'
-----------------------------
**The following record should not be selected:**
`start_date`, `end_date`
'2003-06-04', '2010-01-01'
мой запрос:
SELECT *
FROM `test_table`
WHERE
CAST('2009-12-15' AS DATE) NOT BETWEEN start_date and end_date
AND
CAST('2010-01-02' AS DATE) NOT BETWEEN start_date and end_date
есть идеи, почему мой запрос выбирает неправильные записи? Должен ли я изменить порядок значений в запросе на что-то вроде:
start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE)
Спасибо за помощь
7 ответов
Как насчет попробовать:
select * from 'test_table'
where end_date < CAST('2009-12-15' AS DATE)
or start_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 в диапазон заданных дат.
Я думаю, что вы действительно ищете запись, которая не fit в заданном диапазоне дат. Если да, используйте запрос ниже.
SELECT *
FROM `test_table`
WHERE CAST('2009-12-15' AS DATE) > start_date AND CAST('2010-01-02' AS DATE) < end_date
если "не" ставится перед start_date, он должен работать. По какой-то причине (я не знаю почему), когда " не "ставится перед "между", кажется, что все возвращается.
NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))
предполагая, что это значение перед параметром
интервал [начальная_дата..end_date] не между двумя датами просто означает, что он начинается до 2009-12-15 или заканчивается после 2010-01-02.
затем вы можете просто сделать
start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)
для перекрытия start_date таблицы должен быть меньше даты окончания интервала (т. е. он должен начинаться до конца интервала), а end_date таблицы должен быть больше даты начала интервала. Возможно, вам придется использовать = в зависимости от ваших требований.