查找一个日期是否被另一日期段包含,即找出日期交集的记录数据库的结构是:ID    pID     Date             
1     10      2011-03-01       
2     10      2011-03-15       
3     11      2011-04-15       
4     12      2011-03-06      
5     12      2011-03-08       
6     13      2011-03-06相同pID,如果有两条记录的话Date相当于是开始日期,结束日期,如果只有一条记录Date相当于开始日期,没有结束日期搜索日期:2011/03/06 - 2011/03/08   想要的结果是ID=1,2,6的记录;
    日期:2011/03/01 - 2011/03/15   想要的结果是ID=4,5,6的记录;请问SQL语句怎么写?     

解决方案 »

  1.   


    select pid,[开始日期],(case when [结束日期] = [开始日期] then null else [结束日期] end) [结束日期]
    from(
        select pid,min(date) [开始日期],max(date) [结束日期]
        from tb
        group by pid
    )t
      

  2.   

    就是查找的时间段是否被相同pID的时间段所包含
      

  3.   

    我想可能这种形式用一条SQL语句写不出来了.换另一个形式id   开始日期       结束日期
    1    2011-03-01   2011-03-15
    2    2011-04-13   2011-04-18
    3    2011-03-06   2011-03-10
    4    2011-03-11   2011-03-13
    4    2011-05-11   2011-6-13
    搜索日期:2011/03/06 - 2011/03/08 想要的结果是ID=1的记录;
      日期:2011/03/01 - 2011/03/15 想要的结果是ID=3,4的记录;
     日期:2011/04/13  想要的结果是ID=2的记录;
    查找的时间段是否被另一时间段所包含或者有没有包含其它时间段,把包含或被包含的记录取出来请问用SQL怎么写?
      

  4.   

    针对第一条的查找,效率比较低
    CREATE TABLE t (id INT ,pid INT ,date VARCHAR(20))
    INSERT t
    SELECT 1, 10, '2011-03-01' UNION ALL  
    SELECT 2, 10, '2011-03-15' UNION ALL   
    SELECT 3, 11, '2011-04-15' UNION ALL   
    SELECT 4, 12, '2011-03-06' UNION ALL   
    SELECT 5, 12, '2011-03-08' UNION ALL   
    SELECT 6, 13, '2011-03-06'
    SELECT  id
    FROM    dbo.t
    WHERE   pid IN ( SELECT pid
                     FROM   ( SELECT    *
                              FROM      dbo.t a
                              WHERE     NOT EXISTS ( SELECT 1
                                                     FROM   dbo.t b
                                                     WHERE  a.pid = b.pid
                                                            AND a.date > b.date )
                            ) c
                     WHERE  c.date <= '2011-03-06' ) --所有开始时间小于等于2011-03-06的pid
            AND pid IN (
            SELECT  pid
            FROM    dbo.t
            WHERE   id NOT IN ( SELECT  id
                                FROM    dbo.t a
                                WHERE   NOT EXISTS ( SELECT 1
                                                     FROM   dbo.t b
                                                     WHERE  a.pid = b.pid
                                                            AND a.date > b.date ) )
                    AND dbo.t.date > '2011-03-08'--结束时间大于2011-03-08的pid
            UNION ALL--交集
            SELECT  pid
            FROM    dbo.t
            GROUP BY pid
            HAVING  COUNT(id) = 1 )--没有结束时间的pid
    id
    -----------
    1
    2
    6(3 行受影响)