假设有一表,表结构为StartDate,EndDate开始日期和结束日期
而用户输入另2个日期StartDate2,EndDate2StartDate2为2009-4-1
endDate2为2009-5-4如果查询表中StartDate和EndDate和用户输入的时间间隔有冲突的结果我做的是一个订房管理系统,用户输入某个房间的入住时间和离开时间后。。我是想查询该段时间是否存在已被预订的记录。。没头绪。。谢谢大家

解决方案 »

  1.   

    假设有一表,表结构为StartDate,EndDate开始日期和结束日期
    而用户输入另2个日期StartDate2,EndDate2StartDate2为2009-4-1
    endDate2为2009-5-4如果查询表中StartDate和EndDate和用户输入的时间间隔有冲突的结果我做的是一个订房管理系统,用户输入某个房间的入住时间和离开时间后。。我是想查询该段时间是否存在已被预订的记录。。没头绪。。谢谢大家比如说库内有一条已订房记录  StartDate 为2010/4/20 EndDate为2010/5/2有一客人提交表单订2010/4/1 到 2010/4/23号的房我想做的就是根据客人提交的时间段,查询是否数据库得知是否有空房单独的一天比如说2010/4/1日。这个我知道用Datediff就可以查到,关键是一个时间段,如何做到查询是否有空房
      

  2.   

    =。=  如果在程序上做我可以将用户输入的2010/4/1号到2010/4/23号做个循环将循环中的每一天和库中的Startdate以及Enddate做Datediff对比但这样做。。太耗资源了
      

  3.   

    --> 测试数据: [t]
    if object_id('[t]') is not null drop table [t]
    create table [t] (StartDate datetime,EndDate datetime)
    insert into [t]
    select '2010/4/20','2010-05-01'declare @star datetime,@end datetime
    set @star='2010-4-1'
    set @star='2010-4-23'
    select case when count(*)>0 then '冲突' else '空闲' end
     from [t] where @star between startdate and enddate
    or @end between startdate and enddate
      

  4.   

    http://blog.csdn.net/misterliwei/archive/2010/01/29/5271307.aspx
      

  5.   

    假设你是在写存储过程,输入参数是@StartDate2 Datetime,@EndDate2 DateTime那么一开始就可以写一个IF判断IF NOT EXISTS(SELECT * FROM 表1 WHERE BeginDate <= @EndDate2 AND EndDate >= @BeginDate)
    BEGIN
      --没有冲突
      .......
    END
      

  6.   

    if object_id('t_room_book','U') is not null
        drop table t_room_book;
    go
    create table t_room_book(
        StartDate   datetime
        ,EndDate    datetime
    )
    go
    insert into t_room_book
    select '2010-01-01 00:00:00.000','2010-01-02 12:00:00.000' union all
    select '2010-01-03 00:00:00.000','2010-01-04 12:00:00.000' union all
    select '2010-01-07 00:00:00.000','2010-01-10 12:00:00.000' union all
    select '2010-01-11 00:00:00.000','2010-01-13 12:00:00.000' union all
    select '2010-01-15 00:00:00.000','2010-01-17 12:00:00.000'
    godeclare @StartDate datetime, @EndDate datetime
    set @StartDate = '2010-01-04 16:00:00.000'
    set @EndDate = '2010-01-06 20:00:00.000'declare @isbooked int
    select 
        @isbooked = count(*)
    from 
        t_room_book
    where 
        @StartDate between StartDate and EndDate
        and @EndDate between StartDate and EndDateif @isbooked >0
        print '已被预约'
    else 
        print '未被预约'--结果
    /*
    (5 行受影响)
    未被预约
    */
      

  7.   

    create table tb(id int,StartDate datetime,EndDate datetime)
    insert into tb values(1 , '2009-01-01' , '2009-01-02')
    insert into tb values(2 , '2009-04-01' , '2009-04-02')
    godeclare @dt1 as datetime
    declare @dt2 as datetime
    set @dt1 = '2009-4-1'
    set @dt2 = '2009-5-4'select * , case when @dt1 between StartDate and EndDate or 
                         @dt2 between StartDate and EndDate or
                         StartDate between @dt1 and @dt2 or
                         EndDate between @dt1 and @dt2
                    then '冲突'
                    else '不冲突'
               end
    from tbdrop table tb/*
    id          StartDate                                              EndDate                                                       
    ----------- ------------------------------------------------------ ------------------------------------------------------ ------ 
    1           2009-01-01 00:00:00.000                                2009-01-02 00:00:00.000                                不冲突
    2           2009-04-01 00:00:00.000                                2009-04-02 00:00:00.000                                冲突(所影响的行数为 2 行)
    */
      

  8.   

    --where条件错了,应该是or
    if object_id('t_room_book','U') is not null
        drop table t_room_book;
    go
    create table t_room_book(
        StartDate   datetime
        ,EndDate    datetime
    )
    go
    insert into t_room_book
    select '2010-01-01 00:00:00.000','2010-01-02 12:00:00.000' union all
    select '2010-01-03 00:00:00.000','2010-01-04 12:00:00.000' union all
    select '2010-01-07 00:00:00.000','2010-01-10 12:00:00.000' union all
    select '2010-01-11 00:00:00.000','2010-01-13 12:00:00.000' union all
    select '2010-01-15 00:00:00.000','2010-01-17 12:00:00.000'
    godeclare @StartDate datetime, @EndDate datetime
    set @StartDate = '2010-01-04 16:00:00.000'
    set @EndDate = '2010-01-06 20:00:00.000'declare @isbooked int
    select 
        @isbooked = count(*)
    from 
        t_room_book
    where 
        @StartDate between StartDate and EndDate
        or @EndDate between StartDate and EndDateif @isbooked >0
        print '已被预约'
    else 
        print '未被预约'--结果
    /*
    (5 行受影响)
    未被预约
    */
      

  9.   

    谢谢各位,6楼的方法简单有效,一个select语句解决问题拜谢
    方法如下:
    判断两个时间段是否相交SQL中常常要判断两个时间段是否相交,该如何判断呢?比如两个时间段(S1,E1)和(S2,E2)。我最先想到的是下面的方法一。方法一:(S1 BETWEEN S2 AND E2) OR (E1 BETWEEN S2 AND E2)。很好理解:一个时间段的开始时间S1在另一个时间中间(S2,E2),或者结束时间E1在另一个时间中间(S2,E2)。
    这个方法比较繁琐,我们来看方法二.方法二:本方法先考虑这两段时间什么情况下不相交,如下图:
       -----+-----------------+-----------------+--------------+--------------          S1                    E1                  S2                 E2    -----+-----------------+-----------------+--------------+--------------          S2                    E2                  S1                 E1  无非两种情况:(S1,E1)段在(S2,E2)段前面和(S1,E1)段在(S2,E2)段后面。其对应的表达式为:(S2 > E1) OR (S1 >  E2)。于是相交条件就是 NOT((S2 > E1) OR (S1 >  E2))该式等价于
    (S2 <= E1)AND (S1 <= E2) 这就是我们要的。其实方法一和方法二的条件是一致的:
    ((S1 <=  E2) AND (S1 >= S2)) OR ((E1 <= E2) AND (E1 >= S2))
      =>((S1 <= E2) AND (S1 >= S2) ) OR ((S1 <= E2 ) AND (E1 >= S2))  (因为S1 <= E1)
    <=> (S1 <= E2) AND ((S1 >= S2) OR (E1 >= S2))
      => (S1 <= E2) AND ((E1 >= S2 ) OR (E1 >= S2))  (因为 S1 <= E1)
    <=>(S1 <= E2) AND (E1 >= S2)