代码之家  ›  专栏  ›  技术社区  ›  Kelvin

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

  •  14
  • Kelvin  · 技术社区  · 15 年前

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

    谢谢你的帮助

    7 回复  |  直到 8 年前
        1
  •  26
  •   Jim Lynn    15 年前

    试一试怎么样:

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

    它将返回所有根本不与您的日期范围重叠的日期范围。

        2
  •  7
  •   Dereleased    15 年前

    你的逻辑是向后的。

    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)
    
        3
  •  2
  •   Tony Andrews    15 年前

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

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

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

        4
  •  1
  •   Johannes Rudolph    15 年前

    您当前所做的是检查开始日期和结束日期是否都在给定日期的范围内。

    我猜你真正想找的是一张唱片,但它没有 适合 在给定的日期范围内。如果是,请使用下面的查询。

    SELECT * 
        FROM `test_table` 
        WHERE  CAST('2009-12-15' AS DATE) > start_date  AND  CAST('2010-01-02' AS DATE) < end_date
    
        5
  •  1
  •   brandonstrong    8 年前

    如果在开始日期之前输入“not”,它应该可以工作。出于某种原因(我不知道为什么),当“不”放在“中间”之前时,它似乎会返回所有内容。

    NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE))
    
        6
  •  0
  •   yu_sha    15 年前

    假设开始日期早于结束日期,

    间隔[开始日期..结束日期]不在两个日期之间,只是意味着要么在2009-12-15之前开始,要么在2010-01-02之后结束。

    那你就可以简单地

    start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE)
    
        7
  •  0
  •   Jim Garrison    15 年前

    为了有重叠,表的开始日期必须小于间隔结束日期(即必须在间隔结束之前开始),表的结束日期必须大于间隔开始日期。您可能需要使用<=和>=取决于您的要求。