SQL查询不在两个日期之间

时间:2009-11-09 17:16:15

标签: sql between

我需要一些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 个答案:

答案 0 :(得分:26)

尝试怎么样:

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

将返回所有与日期范围不重叠的日期范围。

答案 1 :(得分:7)

你的逻辑是倒退的。

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 :(得分:2)

您的意思是所选行的日期范围不应完全位于指定的日期范围内吗?在这种情况下:

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

(上面的语法适用于Oracle,您的语法可能略有不同)。

答案 3 :(得分:1)

您目前正在做的是检查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

答案 4 :(得分:1)

如果将'NOT'放在start_date之前,它应该可以工作。出于某种原因(我不知道为什么)当'NOT'被放在'BETWEEN'之前时,它似乎会返回所有内容。

NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))

答案 5 :(得分:0)

假设start_date在end_date之前,

interval [start_date..end_date] NOT BETWEEN两个日期只是意味着它在2009-12-15之前开始或在2010-01-02之后结束。

然后你可以简单地做

start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)

答案 6 :(得分:0)

为了存在重叠,表的start_date必须小于间隔结束日期(即它必须在间隔结束之前开始)并且表的end_date必须大于间隔开始日期。您可能需要根据您的要求使用&lt; =和&gt; =。