Sean, you definately got me :)
Your solution is simpler and much more elegant!

Had the visual aids here on paper, but I'm not as good
with the ascii art as you.

I definately learned something!

Thanks!

-Mike

--- [EMAIL PROTECTED] wrote:

> Mike, you did a wonderful job at analysis
> (identifying the 6 cases) but I 
> think a series of visual clues would have made a
> simpler query more 
> obvious.  Here's how I understand the issue (I am a
> more visual thinker)
> 
> Start with the case of needing to see if a new
> record (NR) overlaps with 
> an exisiting record (ER). In this case both NR and
> ER would have start 
> dates and end dates so intermediate calculations are
> avoided (speed 
> boost).
> 
> If the ER is scheduled to finish BEFORE The start of
> the NR, it the 
> situation looks like this:
> 
> fig a.
> ER:   |---------|
> NR:               |-----------|
> 
> If the ER is scheduled for a time AFTER the NR the
> situation looks like 
> this:
> 
> fig b.
> ER:                      |----------|
> NR:  |--------------|
> 
> Leaving us with the 4 kinds of overlaps. Overlaps 1
> and 2 are when the NR 
> starts before the ER but ends within the ER's
> scheduled time and vice 
> versa
> 
> fig c.
> ER:      |-------|  or |-----|
> NR:  |------|             |-----|
> 
> Overlaps 3 and 4 are if one schedule is completely
> surrounded by the 
> other:
> 
> fig d.
> ER: |------------| or   |--|
> NR:    |-----|        |---------|
> 
> Using these visual aids, we can notice a pattern of
> all of the situations 
> where a conflict exists:
> 
> a) the starting date of one event is BEFORE the
> ending date of the other
> AND
> b) the ending date of one event is AFTER the
> starting data of the other.
> 
> In either situation where BOTH terms are NOT true,
> there will be no 
> overlap. So to find your overlapping events check
> for both comparisons to 
> be true. Notice that sequencing doesn't matter so
> long as you compare 
> opposite ends of the events.
> 
> That simplifies the original query to:
> 
> SELECT count(TAID) as total
> FROM tbl_schedule 
> WHERE (TAID = 1) 
> AND '2005-10-27 17:30' < ends 
> AND '2005-10-27 18:10' > starts;
> 
> I have also seen this analysis stated more
> rigorously using Boolean 
> Algebra. I don't have a link to it but it may be
> interesting for some of 
> you if you took the time to go find it. 
> 
> Shawn Green
> Database Administrator
> Unimin Corporation - Spruce Pine
> 
> 
> Michael McFadden <[EMAIL PROTECTED]> wrote on
> 10/27/2005 08:24:54 PM:
> 
> > Hi C.F.
> > 
> > I'm new to the list, so please excuse me if I'm
> > answering out-of-turn from the pro's here.
> > 
> > I think the answer is to also check if the
> > BusyTime_start is between start and end of the
> > attempted scheduled. 
> > 
> > ie:
> > WHERE
> > (TAID = 1) AND 
> > (('2005-10-27 17:30' BETWEEN starts AND ends) OR
> > ('2005-10-27 18:10' BETWEEN starts AND ends) OR
> > (starts BETWEEN '2005-10-27 17:30' AND '2005-10-27
> > 18:10))
> > 
> > I think you only need to check starts (see case 5
> > below)  because the other case is picked up by the
> > first two checks. (see case 6 below)
> > 
> > The way I see it, you have 6 cases, but some
> > simplification can be done, as I have noted:
> > 
> > 1) attempted schedule time lies outside of busy
> times
> > (return 0 = NOT BUSY)
> > 2) attempted schedule end time lies between busy
> times
> > (return !0 = busy)
> > 3) attempted schedule begin time lies between busy
> > times (return !0 = busy)
> > 4) attempted schedule begin AND end time lie
> between
> > busy times (return !0 = busy)
> >    [this case is a special case of #2 and #3, so
> it
> > really disappears!]
> > 5) Busy Time begin time lies between attempted
> > schedule begin and end times (the problem)
> > 6) Busy Time end time lies between attempted
> schedule
> > begin and end times (the problem)
> > 
> > You must check either case 5 or 6 to be sure to
> catch
> > the 'attempted schedule wraps busy schedule' case.
>  If
> > not, you obviously see the problem.
> > 
> > I think that only case 5 or 6 needs to be checked
> (not
> > both) because if one of those is not true, then 
> case
> > 1, 2, 3 [or 4] (the only one's left!) must be
> true.
> > 
> > Hope that helps, and wasn't too confusing! 
> > 
> > -Mike McFadden
> > 
> > --- "C.F. Scheidecker Antunes"
> <[EMAIL PROTECTED]>
> > wrote:
> > 
> > > Hello all,
> > > 
> > > I have a TA table to record TA UNAVAILABLE
> times.
> > > This table is quite simple. It has a TAID
> number, a
> > > start date and an 
> > > end date.
> > > 
> > > tbl_schedule {
> > > TAID  integer,
> > > starts  datetime,
> > > ends datetime }
> > > 
> > > A valid entry would be a TA whose id is 1 and
> > > between 17:00 and 18:00 he 
> > > is busy.
> > > So:
> > > 1,'2005-10-27 17:00:00','2005-10-27 18:00:00'
> > > 
> > > Each ta can have more than one entry per day. He
> > > might be a busy TA and 
> > > have a lot
> > > of meetings scheduled. The meetings do not have
> to
> > > be 1 hour length, 
> > > they can be 5 or 10 minutes.
> > > So something like this would also be valid:
> > > 1,'2005-10-27 17:05:00','2005-10-27 17:10:00'
> > > 
> > > Now, I need to check, given a start and end
> dates,
> > > if that would overlap 
> > > with some record already present
> > > in the database.
> > > If I want to know if the TA is busy between
> 17:30
> > > and 18:10 I could I 
> > > issue something like this:
> > > 
> > > SELECT count(TAID) as total FROM tbl_schedule
> where
> > > (TAID = 1) AND 
> > > (('2005-10-27 17:30' BETWEEN starts AND ends) OR
> > > ('2005-10-27 18:10' 
> > > BETWEEN starts AND ends))
> > > 
> 
=== message truncated ===



        
                
__________________________________ 
Yahoo! Mail - PC Magazine Editors' Choice 2005 
http://mail.yahoo.com

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to