SQL查询不在两个日期之间。

23

我需要在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)

非常感谢任何帮助


如果在 start_date 前面加上 NOT,它应该可以工作。 - brandonstrong
7个回答

31

不妨试试:

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

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


2
我建议不要这样做,在中等大小的表上,这将导致查询变得非常缓慢。 - Xnoise
3
@xnoise - 请告诉我,你有什么替代方案? - MatBailie
4
请问为什么在这里使用“NOT BETWEEN”不起作用? - M H
我已经回答了一个与@Xnoise建议相对应的解决方案。 - brandonstrong

17

你的逻辑反了。

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)

这是正确的解决方案,应该被采纳为答案! - Marcell

4
如果在start_date之前加上'NOT',它应该可以正常工作。由于某些原因(我不知道是什么原因),当在'BETWEEN'之前加上'NOT'时,似乎会返回所有内容。
NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))

3
您的意思是所选行的日期范围不应完全落在指定的日期范围内吗?如果是这种情况:
select *
from test_table
where start_date < date '2009-12-15'
or end_date > date '2010-01-02';

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

1
你现在正在做的是检查开始日期和结束日期是否都不落在给定日期范围内。
我想你真正想要的是一个记录不在给定日期范围内。如果是这样,请使用以下查询语句。
SELECT * 
    FROM `test_table` 
    WHERE  CAST('2009-12-15' AS DATE) > start_date  AND  CAST('2010-01-02' AS DATE) < end_date

0

假设start_date在end_date之前,

区间[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)

0

如果要有重叠,表格的 start_date 必须小于区间的 end date(即必须在区间结束之前开始),并且表格的 end_date 必须大于区间的 start date。根据您的需求,您可能需要使用 <= 和 >=。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接