Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (StartDate1 <= EndDate2) and (StartDate2 <= EndDate1)
- ----------------------|-------A-------|----------------------
- |----B1----|
- |----B2----|
- |----B3----|
- |----------B4----------|
- |----------------B5----------------|
- |----B6----|
- ----------------------|-------A-------|----------------------
- |------B7-------|
- |----------B8-----------|
- |----B9----|
- |----B10-----|
- |--------B11--------|
- |----B12----|
- |----B13----|
- ----------------------|-------A-------|----------------------
- |----------------------| range 1
- |---> range 2 overlap
- |---> range 2 overlap
- |---> range 2 overlap
- |---> range 2 no overlap
- def doesOverlap (r1,r2):
- if r1.s > r2.s:
- swap r1, r2
- if r2.s > r1.e:
- return false
- return true
- |----------------------| range 1
- |---> range 2 overlap
- |---> range 2 overlap
- |---> range 2 no overlap
- |---> range 2 no overlap
- StartDate1.IsBetween(StartDate2, EndDate2) || EndDate1.IsBetween(StartDate2, EndDate2)
- public static bool IsBetween(this DateTime value, DateTime left, DateTime right) {
- return (value > left && value < right) || (value < left && value > right);
- }
- // Takes a list and returns all records that have overlapping time ranges.
- public static IEnumerable<T> GetOverlappedTimes<T>(IEnumerable<T> list, Func<T, bool> filter, Func<T,DateTime> start, Func<T, DateTime> end)
- {
- // Selects all records that match filter() on left side and returns all records on right side that overlap.
- var overlap = from t1 in list
- where filter(t1)
- from t2 in list
- where !object.Equals(t1, t2) // Don't match the same record on right side.
- let in1 = start(t1)
- let out1 = end(t1)
- let in2 = start(t2)
- let out2 = end(t2)
- where in1 <= out2 && out1 >= in2
- let totover = GetMins(in1, out1, in2, out2)
- select t2;
- return overlap;
- }
- public static void TestOverlap()
- {
- var tl1 = new TempTimeEntry() { ID = 1, Name = "Bill", In = "1/1/08 1:00pm".ToDate(), Out = "1/1/08 4:00pm".ToDate() };
- var tl2 = new TempTimeEntry() { ID = 2, Name = "John", In = "1/1/08 5:00pm".ToDate(), Out = "1/1/08 6:00pm".ToDate() };
- var tl3 = new TempTimeEntry() { ID = 3, Name = "Lisa", In = "1/1/08 7:00pm".ToDate(), Out = "1/1/08 9:00pm".ToDate() };
- var tl4 = new TempTimeEntry() { ID = 4, Name = "Joe", In = "1/1/08 3:00pm".ToDate(), Out = "1/1/08 8:00pm".ToDate() };
- var tl5 = new TempTimeEntry() { ID = 1, Name = "Bill", In = "1/1/08 8:01pm".ToDate(), Out = "1/1/08 8:00pm".ToDate() };
- var list = new List<TempTimeEntry>() { tl1, tl2, tl3, tl4, tl5 };
- var overlap = GetOverlappedTimes(list, (TempTimeEntry t1)=>t1.ID==1, (TempTimeEntry tIn) => tIn.In, (TempTimeEntry tOut) => tOut.Out);
- Console.WriteLine("nRecords overlap:");
- foreach (var tl in overlap)
- Console.WriteLine("Name:{0} T1In:{1} T1Out:{2}", tl.Name, tl.In, tl.Out);
- Console.WriteLine("Done");
- /* Output:
- Records overlap:
- Name:Joe T1In:1/1/2008 3:00:00 PM T1Out:1/1/2008 8:00:00 PM
- Name:Lisa T1In:1/1/2008 7:00:00 PM T1Out:1/1/2008 9:00:00 PM
- Done
- */
- }
- // ------------------------------------------------------------------------
- public enum PeriodRelation
- {
- After,
- StartTouching,
- StartInside,
- InsideStartTouching,
- EnclosingStartTouching,
- Enclosing,
- EnclosingEndTouching,
- ExactMatch,
- Inside,
- InsideEndTouching,
- EndInside,
- EndTouching,
- Before,
- } // enum PeriodRelation
- declare
- @StartDate date,
- @EndDate date
- select
- @StartDate = '1900-01-01',
- @EndDate = '2049-12-31'
- create table Numbers
- (
- Id int identity (1, 1),
- Date date primary key
- )
- ;
- with
- DateList as -- list of dates
- (
- select @StartDate as Date
- union all
- select dateadd(d, 1, Date) from DateList where datediff(d, Date, @EndDate) > 0
- )
- insert
- Numbers
- (
- Date
- )
- select
- Date
- from
- DateList
- option (maxrecursion 0)
- alter function FnOverlaps
- (
- @StartDateA datetime,
- @EndDateA datetime,
- @StartDateB datetime,
- @EndDateB datetime
- )
- returns bit
- as
- begin
- declare
- @RetVal bit
- ;
- with
- ins as
- (
- select Date from Numbers where Date between @StartDateA and @EndDateA
- intersect
- select Date from Numbers where Date between @StartDateB and @EndDateB
- )
- select @RetVal = case when count(*) = 0 then 0 else 1 end from ins
- return @RetVal
- end
- go
- -- test here
- select dbo.FnOverlaps('2005-01-01', '2005-12-31', '2004-01-01', '2004-01-31')
Add Comment
Please, Sign In to add comment