19

我需要一些有关 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)

非常感谢您的帮助

4

7 回答 7

28

试试怎么样:

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

这将返回与您的日期范围完全不重叠的所有日期范围。

于 2009-11-09T17:25:05.737 回答
9

你的逻辑是倒退的。

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)
于 2009-11-09T17:24:46.993 回答
3

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

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

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

于 2009-11-09T17:22:13.247 回答
3

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

NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))
于 2017-01-30T15:45:29.887 回答
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
于 2009-11-09T17:23:48.053 回答
0

假设 start_date 在 end_date 之前,

间隔 [start_date..end_date] NOT BETWEEN 两个日期只是意味着它要么在 2009 年 12 月 15 日之前开始,要么在 2010 年 1 月 2 日之后结束。

然后你可以简单地做

start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)
于 2009-11-09T17:23:19.723 回答
0

对于重叠,表格的 start_date 必须小于间隔结束日期(即它必须在间隔结束之前开始)并且表格的 end_date 必须大于间隔开始日期。根据您的要求,您可能需要使用 <= 和 >=。

于 2009-11-09T17:27:54.343 回答