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)
Большое спасибо за любую помощь
Решение
Как насчет того, чтобы попробовать:
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 в диапазон указанных дат.
Я предполагаю, что то, что вы действительно ищете, - это запись, которая не подходит в указанном диапазоне дат.Если это так, используйте приведенный ниже запрос.
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', это должно сработать.По какой-то причине (я не знаю почему), когда 'NOT' ставится перед 'BETWEEN', кажется, что это возвращает все.
NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))
Предполагая, что start_date находится перед end_date,
интервал [start_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)
Чтобы было перекрытие, начальная дата таблицы должна быть МЕНЬШЕ даты окончания интервала (т.е.он должен начинаться до окончания интервала), А конечная дата таблицы должна быть БОЛЬШЕ даты начала интервала.Возможно, вам потребуется использовать <= и >= в зависимости от ваших требований.