2017-08-01 83 views
0

我有這些列計劃表衝突:檢查是否有新的開始時間和結束時間不與現有的開始時間和結束時間在同一天

LeaveDate DateTime 
Start_Time varchar 
End_Time varchar 

之前,我添加值,我需要一個該查詢將首先檢查我的Start_Time,End_Time和LeaveDate輸入是否與現有記錄不衝突。

這裏是我現有的記錄:

Rec LeaveDate Start_Time End_Time 
1 01/01/2017 9:00:00  13:30:00 

有效輸入 - 請注意,新START_TIME可以等於在同一日期的現有END_TIME:

LeaveDate Start_Time End_Time 
01/01/2017 13:30:00  18:00:00 

或者

LeaveDate Start_Time End_Time 
01/01/2017 13:43:00  18:00:00 

無效輸入:

LeaveDate Start_Time End_Time 
01/01/2017 13:29:00  18:00:00 

或者

LeaveDate Start_Time End_Time 
01/01/2017 10:00:00  11:00:00 
+6

您應該做的第一件事是更改您的表的數據類型。 'LeaveDate'應該是'Date'類型,'Start_Time'和'End_Time'應該是'Time'類型。欲瞭解更多信息,請閱讀Aaron Bertrand [踢壞的壞習慣:選擇錯誤的數據類型](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using- the-wrong-data-type.aspx)接下來要做的是閱讀['overlap' tag wiki。](https://stackoverflow.com/tags/overlap/info) –

+1

另外,可以安排一些東西在午夜之前開始,在午夜之後結束?如果是這樣,那會讓事情變得複雜。 –

+0

這是在SQL Server中,沒有僅限日期和時間的數據類型。只有日期時間。關於午夜之前/之後,現在我不會包含該功能 –

回答

0

您可以先檢查新的時間表不會與現有的記錄重疊。如果沒有,則插入並在出現錯誤時提出錯誤。

例如:

-- using a table variable for demonstration purposes 
declare @Schedule table (Id int identity(1,1) primary key, LeaveDate datetime, Start_Time varchar(8), End_Time varchar(8)); 

insert into @Schedule (LeaveDate, Start_Time, End_Time) values 
('2017-01-01','09:00:00','13:30:00'); 

declare @LeaveDate date = '2017-01-01'; 
declare @StartTime time = '13:28:00'; 
declare @EndTime time = '14:00:00'; 

if not exists(
    select 1 from @Schedule 
    where LeaveDate = convert(datetime,@LeaveDate,20) 
     and ((@StartTime > cast(Start_Time as time) and @StartTime < cast(End_Time as time)) or 
      (@EndTime > cast(Start_Time as time) and @EndTime < cast(End_Time as time)) 
     ) 
) 
begin 
    insert into @Schedule (LeaveDate, Start_Time, End_Time) values (@LeaveDate,cast(@StartTime as varchar(8)),cast(@EndTime as varchar(8))); 
end 
else 
begin 
    declare @ErrorMessage varchar(max) = concat('schedule [',convert(varchar,@LeaveDate,20),',',cast(@StartTime as varchar(8)),',',cast(@EndTime as varchar(8)),'] overlaps.'); 
    RAISERROR(@ErrorMessage,16,16); 
end; 

對於在例如它會引發錯誤

schedule [2017-01-01,13:28:00,14:00:00] overlaps. 

當然,如果你想先更改類型在表中日期&時間值那麼可以避免演員陣容。

相關問題