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]