Solved

check on overlapping dates

Posted on 2010-08-17
6
653 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
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
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
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 29

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

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

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

Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…

778 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