我需要一些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)
非常感谢您的帮助
答案 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; =。