好贷网好贷款

求句sql写法关于查时间区间是否重叠的. 20xv84]

发布时间:2016-12-5 22:36:00 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"求句sql写法关于查时间区间是否重叠的. 20xv84]",主要涉及到求句sql写法关于查时间区间是否重叠的. 20xv84]方面的内容,对于求句sql写法关于查时间区间是否重叠的. 20xv84]感兴趣的同学可以参考一下。

旅馆预定房间.这么查处某间房间在某个时段内是否被预定了. 表: rooms    字段: ID, starttime ,endtime 我输入2个时间比如 2008-10-1 ,2008-10-7 .想判断下ID=1的房间有没有被预定过.SQL该怎么写?

SELECT *  FROM rooms  WHERE  ID=1        AND (starttime BETWEEN '2008-10-01 AND '2008-10-07'             OR              endtime BETWEEN '2008-10-01 AND '2008-10-07'            )

SELECT *  FROM rooms  WHERE  ID=1        AND (starttime BETWEEN '2008-10-01' AND '2008-10-07'             OR              endtime BETWEEN '2008-10-01' AND '2008-10-07'            )

select * from where ID = 1 and (starttime >'2008-10-7' or endtime <'2008-10-1')

--把表名搞掉了 select * from rooms where ID = 1 and (starttime >'2008-10-7' or endtime <'2008-10-1')

create table tb(ID int, starttime datetime,endtime datetime) insert into tb values(1 , '2008-10-2' , '2008-10-3')  insert into tb values(2 , '2008-10-11' , '2008-10-12') go declare @dt1 as datetime declare @dt2 as datetime set @dt1 = '2008-10-1' set @dt2 = '2008-10-7' --临时表 select top 8000 identity(int,0,1) as id into tmp from syscolumns a,syscolumns b --预定了的。 select distinct m.* from tb m ,  (select dateadd(day , tmp.id , @dt1) dt from tmp where dateadd(day , tmp.id , @dt1) <= @dt2) n where n.dt between m.starttime and m.endtime /* ID          starttime                                              endtime                                                 ----------- ------------------------------------------------------ ------------------------------------------------------  1           2008-10-02 00:00:00.000                                2008-10-03 00:00:00.000 (所影响的行数为 1 行) */ --没有预定的。 select t.* from tb t where id not in ( select distinct m.id from tb m ,  (select dateadd(day , tmp.id , @dt1) dt from tmp where dateadd(day , tmp.id , @dt1) <= @dt2) n where n.dt between m.starttime and m.endtime ) /* ID          starttime                                              endtime                                                 ----------- ------------------------------------------------------ ------------------------------------------------------  ID          starttime                                              endtime                                                 ----------- ------------------------------------------------------ ------------------------------------------------------  2           2008-10-11 00:00:00.000                                2008-10-12 00:00:00.000 (所影响的行数为 1 行) */ drop table tb,tmp /* */

SELECT * FROM rooms WHERE  ID=1        AND (starttime BETWEEN '2008-10-01 AND '2008-10-07'             OR              endtime BETWEEN '2008-10-01 AND '2008-10-07'            )

引用 6 楼 CJHLPLFX 的回复:SELECT * FROM rooms WHERE  ID=1        AND (starttime BETWEEN '2008-10-01 AND '2008-10-07'              OR              endtime BETWEEN '2008-10-01 AND '2008-10-07'            )  如果有条 2008-1-1 到 2008-12-30的就不行了

有4种不满足条件的情况.我自己用笨方法解决了.. 各位看看能优化不? select * from room  where [email protected]  and (starttime < @P1 and @P1<endtime and endtime < @P2)  or (@P1<starttime and endtime<@P2 )  or (@P1<starttime and starttime<@P2 and @P2<endtime) or (starttime<@P1 and @P2<endtime)

反了 SELECT *  FROM rooms  WHERE  ID=1        AND ( '2008-10-01' Between starttime AND EndTIme             OR              '200-10-07' BETWEEN starttime  AND  EndTime            )

靠,我搞错了。 8楼的应该可以,的确是有4种条件。 SELECT *  FROM rooms  WHERE  ID=1        AND (starttime BETWEEN '2008-10-01' AND '2008-10-07'             OR              endtime BETWEEN '2008-10-01' AND '2008-10-07'             OR             '2008-10-01' Between starttime AND EndTIme             OR              '200-10-07' BETWEEN starttime  AND  EndTime             )

翻过来想想啦 如果 没有预订的排除了不就是剩下 预订的了吗 而且没有预订的 只有 2种可能 选定日期 全部 小于 开始日期 或者 选定日期全部大于结束日期 这样就不用楼上那么麻烦了 吧 

引用 1 楼 Garnett_KG 的回复:SQL code SELECT *  FROM rooms  WHERE  ID=1        AND (starttime BETWEEN '2008-10-01 AND '2008-10-07'             OR              endtime BETWEEN '2008-10-01 AND '2008-10-07'            ) 不知道你想什么? 只要你的入住的 starttime ,endtime 任何一个时间在 你所要查询的时间段内 对应的已经被预订的房间就一定要出来,因为任何一个时间在查询的时间段内改房型或房间 就是已经被预订了  还有一个预订酒店房间很重要的问题! 你的endtime 实际上是客人离店时间,那天是不能算被预订了

SELECT *  FROM rooms  WHERE  ID=1        AND (starttime<='2008-10-07'             and              endtime >='2008-10-01'           )

引用楼主 xv84 的帖子:旅馆预定房间.这么查处某间房间在某个时段内是否被预定了.  表: rooms    字段: ID, starttime ,endtime  我输入2个时间比如 2008-10-1 ,2008-10-7 .想判断下ID=1的房间有没有被预定过.SQL该怎么写? declare @num --记录数 select @num=count(*) from rooms where id=1 and  '2008-10-1'<=starttime  and endtime<='2008-10-7' if (@num>0)   begin    print '房间被预定' else  print '没有呗预定'

上一篇:谁研究过2008的表值参数 100Haiwer]
下一篇:发一个SQL SERVER 2008的BUG 0CN_SQL]

相关文章

相关评论