假设有一表,表结构为StartDate,EndDate开始日期和结束日期
而用户输入另2个日期StartDate2,EndDate2StartDate2为2009-4-1
endDate2为2009-5-4如果查询表中StartDate和EndDate和用户输入的时间间隔有冲突的结果我做的是一个订房管理系统,用户输入某个房间的入住时间和离开时间后。。我是想查询该段时间是否存在已被预订的记录。。没头绪。。谢谢大家
而用户输入另2个日期StartDate2,EndDate2StartDate2为2009-4-1
endDate2为2009-5-4如果查询表中StartDate和EndDate和用户输入的时间间隔有冲突的结果我做的是一个订房管理系统,用户输入某个房间的入住时间和离开时间后。。我是想查询该段时间是否存在已被预订的记录。。没头绪。。谢谢大家
解决方案 »
- 在线等 sql left join 查询问题
- 急死我了,请各位大侠帮忙看看,我现在要做一个sqlce 和 sql server 的合并复制,捕捉不到错误信息!!!!
- 联合查询 如何进行多表加减
- a机可以用sql server身份验证连接到b机,而b机不可以用sql server 身份验证连接到a机
- 库存汇总表的问题
- 语句运行老是错误怎么办????
- SQL本地服务器运行不了怎么办?
- 在SQL2005 里检索XML类型数据的子节点的值
- 求一条SQL语句
- 数据库插入记录后的问题,求救,在线等候。。。大力在吗?
- WIN2003+SQL2000(SQL2005)群集,怎么样SQL才能否访问多个盘符?
- 有关表横向连接问题
而用户输入另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就可以查到,关键是一个时间段,如何做到查询是否有空房
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
BEGIN
--没有冲突
.......
END
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 行受影响)
未被预约
*/
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 行)
*/
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 行受影响)
未被预约
*/
方法如下:
判断两个时间段是否相交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)