I’m using a custom PHP function to produce a visual calendar for a single month that blocks out dates based on a table that contains an start date, and an duration – For example:

…This is produced by data saying that the table should be blocked out for 4 days from the 14th, and 7 days from the 27th.
The query looks something like this:
SELECT GROUP_CONCAT(DATE_FORMAT(start_date,'%d'),':', event_duration) AS info
FROM events
WHERE YEAR(start_date = '2012'
AND MONTH(start_date) = '07'
ORDER BY start_date
(You could safely ignore the group concat and return the data as individual rows, that doesn’t really matter).
I’m looking for a modification to the query that would block out dates at the start of the month IF an event starts in the previous month, but its length takes it into the following.
For instance – in the above example, the event on the 27th is actually scheduled to last 7 days in the database, so if I ran the query for MONTH(start_date) = '08' I’d like to say the first two dates blocked out, which they wouldn’t currently be, because the start date that would block it out is not in the month being selected.
I’m fairly sure there’s a subquery or something in there to grab the rows, but I just can’t think of it. Any takers?
EDIT
The answer from Salman below pointed me in the directon I wanted to go, and I came up with this as a way of getting carryovers from the previous month to show as ‘1st’ of the month with the number of remaining days:
SELECT IF(MONTH(start_date) < '08', '2012-08-01', start_date) AS starter,
IF(MONTH(start_date) < '08', duration - DATEDIFF('2012-08-01',start_date), duration) AS duration
FROM EVENTS
WHERE YEAR(start_date) = '2012'
AND (MONTH(start_date) = '08' OR MONTH(start_date + INTERVAL duration DAY) = '08')
Obviously a lot of variables there to replace in PHP, so maybe there’s an even better way?
Original Answer:
Assuming that the month in question is
2012-07, you need this query:Revised Answer:
Apparently you need a query that checks for overlapping (or conflicting) dates. The example dates are
2012-07-01through2012-08-01and the query is:To constrain the start date and interval, you can use
SELECT ... CASEstatement: