Solved

check on overlapping dates

Posted on 2010-08-17
6
657 Views
Last Modified: 2013-11-27
I have an object which has two date values begin date and end date.  In fact there are multiple objects with begin date and end date. what i want to do is check that the dates of this objects dont overlap with each other. so for example object[0]'s begin date and end date is 08/16/2010 - 08/30/2010 and for object [1] begin date and end date is 08/20/2010-09/30/2010. if this the case then i wan to throw and error message.

can someone tell me how to do this in C#.

0
Comment
Question by:pratikshahse
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
6 Comments
 
LVL 27

Accepted Solution

by:
nmarun earned 250 total points
ID: 33457462
Here's a snippet that worked for me.Arun
public class Dummy
{
    public int Id { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

private static void CheckOverlapDates()
{
    List<Dummy> dummies = new List<Dummy>();
    dummies.Add(new Dummy
                    {
                        Id = 1,
                        StartDate = new DateTime(2010, 1, 1),
                        EndDate = new DateTime(2010, 1, 10)
                    });
    dummies.Add(new Dummy
                    {
                        Id = 2,
                        StartDate = new DateTime(2010, 1, 8),
                        EndDate = new DateTime(2010, 1, 20)
                    });
    dummies.Add(new Dummy
                    {
                        Id = 3,
                        StartDate = new DateTime(2010, 1, 20),
                        EndDate = new DateTime(2010, 1, 30)
                    });
    dummies.Add(new Dummy
                    {
                        Id = 4,
                        StartDate = new DateTime(2010, 1, 30),
                        EndDate = new DateTime(2010, 2, 10)
                    });
    dummies.Add(new Dummy
                    {
                        Id = 5,
                        StartDate = new DateTime(2010, 2, 10),
                        EndDate = new DateTime(2010, 2, 20)
                    });

    for (int i = 0; i < dummies.Count; i++)
    {
        for (int j = i+1; j < dummies.Count; j++)
        {
            if(dummies[i].EndDate > dummies[j].StartDate)
            {
                Console.WriteLine("object {0} overlaps with object {1}", dummies[i].Id, dummies[j].Id);
            }
        }
    }
}

Open in new window

0
 
LVL 16

Assisted Solution

by:kris_per
kris_per earned 250 total points
ID: 33457663
Logic is:
- if one's start date is within another's start/end dates
- or if one's end date is within another's start/end dates

public bool IsOverlapping()
        {
            List<MyObject> list = new List<MyObject>();

            foreach (MyObject o in list)
            {
                foreach (MyObject i in list)
                {
                    // logic is - if one start date is within another start/end dates
                    // or if one end date is within another start/end dates
                    if( (i.StartDate > o.StartDate && i.StartDate < o.EndDate)
                        || (i.EndDate > o.StartDate && i.EndDate < o.EndDate)
                        || (o.StartDate > i.StartDate && o.StartDate < i.EndDate)
                        || (o.EndDate > i.StartDate && o.EndDate < i.EndDate) )
                    {
                        return true; // yes overlapping
                    }
                }
            }

            return false; // not overlapping
        }

Open in new window

0
 
LVL 16

Expert Comment

by:kris_per
ID: 33457699

Contnuing previous code, If the overlapping is including the dates, then you have to add '=' operator in all comparisons above:
public static bool IsOverlapping()
        {
            List<MyObject> list = new List<MyObject>();

            foreach (MyObject o in list)
            {
                foreach (MyObject i in list)
                {
                    // logic is - if one start date is within another start/end dates
                    // or if one end date is within another start/end dates
                    if( (i.StartDate >= o.StartDate && i.StartDate <= o.EndDate)
                        || (i.EndDate >= o.StartDate && i.EndDate <= o.EndDate)
                        || (o.StartDate >= i.StartDate && o.StartDate <= i.EndDate)
                        || (o.EndDate >= i.StartDate && o.EndDate <= i.EndDate))
                    {
                        return true; // yes overlapping
                    }
                }
            }

            return false; // not overlapping
        }

Open in new window

0
Interactive Way of Training for the AWS CSA Exam

An interactive way of learning that will help you visualize core concepts so that you can be more effective when taking your AWS certification exam.  Built for students by a student to help them understand the concepts that they are being taught.

 
LVL 2

Expert Comment

by:Sadrul
ID: 33458755
You should first sort the list in increasing start-date. After that, you can do a linear traversal of the list to figure out if two date-ranges overlap or not. This way, the worst-case running time would be nlog(n), whereas looking in the unsorted list will be n^2.
0
 
LVL 30

Expert Comment

by:anarki_jimbel
ID: 33459291
About sorting (Sadrul's note) - just to remind that sorting also takes some time and has complexity, e.g., n*log(n)
0
 
LVL 2

Expert Comment

by:Sadrul
ID: 33459379
Correct. That is why I note that the overall complexity of the process will also be nlog(n) (sorting takes nlog(n), the linear traversal is n).
0

Featured Post

Instantly Create Instructional Tutorials

Contextual Guidance at the moment of need helps your employees adopt to new software or processes instantly. Boost knowledge retention and employee engagement step-by-step with one easy solution.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…

626 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question