SQL-запрос НЕ между двумя датами - PullRequest
15 голосов
/ 09 ноября 2009

Мне нужна помощь с SQL Query.

Я пытаюсь выбрать все записи из таблицы 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 ]

26 голосов
/ 09 ноября 2009

Как насчет попытки:

select * from 'test_table'
where end_date < CAST('2009-12-15' AS DATE)
or start_date > CAST('2010-01-02' AS DATE)

, который вернет все диапазоны дат, которые не перекрывают ваш диапазон дат.

7 голосов
/ 09 ноября 2009

Ваша логика обратная.

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)
2 голосов
/ 09 ноября 2009

Вы имеете в виду, что диапазон дат выбранных строк не должен полностью находиться в указанном диапазоне дат? В каком случае:

select *
from test_table
where start_date < date '2009-12-15'
or end_date > date '2010-01-02';

(Синтаксис выше для Oracle, ваш может немного отличаться).

1 голос
/ 30 января 2017

Если 'NOT' ставится перед датой start_date, оно должно работать. По какой-то причине (я не знаю почему), когда «NOT» ставится перед «BETWEEN», кажется, что все возвращается.

NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))
1 голос
/ 09 ноября 2009

В настоящее время вы проверяете, попадают ли ни start_date, ни end_date в диапазон указанных дат.

Я думаю, что вы действительно ищете запись, которая не соответствует 1004 * в указанном диапазоне дат. Если это так, используйте запрос ниже.

SELECT * 
    FROM `test_table` 
    WHERE  CAST('2009-12-15' AS DATE) > start_date  AND  CAST('2010-01-02' AS DATE) < end_date
0 голосов
/ 09 ноября 2009

Для перекрытия начальная дата таблицы должна быть МЕНЬШЕ, чем дата окончания интервала (т.е. она должна начинаться до конца интервала), И конечная дата таблицы должна быть БОЛЬШЕ, чем дата начала интервала. Возможно, вам придется использовать <= и> = в зависимости от ваших требований.

0 голосов
/ 09 ноября 2009

Предполагая, что 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)
...