"Shaun" <[EMAIL PROTECTED]> wrote on 09/01/2005 05:38:01 AM:
<big snip -- see earlier posts in this thread for details>
> >> The corrected query should read:
> >> SELECT m.name as month, YEAR(b.Booking_Start_Date) as year,
> >> COUNT(b.Booking_ID) AS "Num_Bookings"
> >> FROM monthList m
> >> LEFT JOIN Bookings b
> >> ON m.id = MONTH(b.Booking_Start_Date)
> >> AND b.User_ID = 1
> >> AND b.Work_Type_ID = 12
> >> AND b.Booking_Start_Date >= '2004-04-01'
> >> AND b.Booking_Start_Date < '2005-04-01'
> >> AND b.Booking_Type = "Booking"
> >> GROUP BY 1, 2
> >> ORDER BY 1, m.id;
> >>
> >> I am so very sorry! Modify my other examples in the same way and they
> >> should work too.
> >>
> >> Shawn Green
> >> Database Administrator
> >> Unimin Corporation - Spruce Pine
> >
> > Thanks Shawn :)
> >
>
> Hi Shawn,
>
> This is all working fine except where a booking spans more than one day
i.e.
> a holiday. I have a column called Booking_End_Date, is there a way to
count
> all the days used where a booking spans more than one day?
>
> Thanks for your help.
>
That's a different question, isn't it. Your first question asked to count
all of the bookings where the starting date was within a certain date
range. Your second question might be rephrased as:
Tell me how many days were booked within a certain date range.
See the difference between the two functions? One is a simple count of how
many rows are in the table, the other is the sum of bookable days. What
functions we can use to make that calculation easier depend on what
version MySQL you are running. What version MySQL are you running? Is this
a simple date span calculation or do we need a list of holidays so that if
a holiday occurs within the span covered by Booking_Start_Date to
Booking_End_Date it won't count as a booked day? Do you count weekends
too? Covering the cases of where a booking starts in one month and ends in
another can also get complicated (oh, it's do-able but it's not as simple
as you might think).
The more exceptions you want to add into this formula, the more convoluted
it becomes and the more processing required to reach the answer you want.
Plus, there is definitely more than one solution so if one way is too slow
or cumbersome or complex, try another.
One of the ways to simplify this calculation is to not enter bookings
across date spans but enter them into the table as a "booking" for each
day. That way you just don't enter a booking for holidays and weekends.
Since each booking has the same "customer_id" or "event_id" (or both) you
can tell instantly how many days were booked for any event or customer
within any month. In this suggestion, complex SQL wasn't the solution but
changing the way you store the data was. If you are locked into your
current storage plan, then you are left with complex SQL processing to get
at your data.
One way to do the multiple-date-entries-per-booking method is to create a
new table, `bookingdates`, that stores the id of the booking and the date
for the booking. Bookings that span multiple dates would have multiple
entries.
CREATE TABLE bookingdates (
booking_id int not null
, bookingdate datetime not null
, UNIQUE (booking_ID, bookingdate)
, key(bookingdate, booking_ID)
);
The indexes are called "covering indexes" and will basically allow you to
load the entire table into memory twice. Once sorted by booking_ID, the
other sorted by bookingdate. Because the index contains all of the data
you could want from a query, the datafile will not need to be touched to
do the actual retrieval. One less random seek and read on the disk means
much faster performance to your application. Just make sure that you do
not create entries where bookings do not happen (like holidays and
weekends). This table, properly filled in, makes not just your first query
but also your second query trivial to answer.
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine