2011-02-28 64 views
0

我有,我需要分配一些资源,一些叉架。例如SQL时间重叠/冲突查询

现有数据库中的要求:约翰史密斯 - 3/1/2011 - 6:00 AM到上午7:00 - 经济
插入:约翰史密斯 - 2011年3月1日 - 上午6:30到上午7:00 - 数学

这里插入第二行时,我想检查这个时候重叠,如果它重叠 我想跳过插入。我可以如何实现这一点?我有Date,FromTime和ToTime在单独的列。

+0

同一问题:http://stackoverflow.com/questions/781895/checking-for-time-range-overlap-the-watchman-problem-sql – Four 2011-02-28 14:35:37

回答

2

使用计算日期:

cast(cast(mydatecolumn as varchar(20)) + ' ' + 
cast(mytimecolumn as varchar(20)) as datetime) 

产量例如start_datetime和end_datetime

假设变量:@inserted_start_datetime,@inserted_end_datetime,@name

Insert Into MyTable(<values>) 
Where not exists ( 
select * from table t2 
where name = @name 
and (@inserted_start_datetime between start_datetime and end_datetime 
    or @inserted_end_datetime between start_datetime and end_datetime 
    or start_datetime between @inserted_start_datetime and @inserted_end_datetime 
    or end_datetime between @inserted_start_datetime and @inserted_end_datetime)) 

EDITED

0

如果您从到日期是在数据库timedates你可以尝试这样的事情

如果不存在(SELECT * FROM表,其中名称=开始时间之间的开始时间和结束时间或@endtime之间@name和@starttime和endTime) begin

做插入。

其中@name =约翰·史密斯 @starttime = 3/1/2011 6:30 @endtime = 3/1/2011七时

端使用转换

0

基本上是这样的:

INSERT INTO atable (Name, Date, FromTime, ToTime, Subject) 
SELECT 
    @Name, 
    @Date, 
    @FromTime, 
    @ToTime, 
    @Subject 
WHERE NOT EXISTS (
    SELECT * FROM atable 
    WHERE Name = @Name AND Date = @Date 
    AND (FromTime >= @FromTime AND FromTime < @ToTime OR 
     @FromTime >= FromTime AND @FromTime < ToTime) 
) 

您可能要添加一些数据如果和需要的话转换。