Sorting by month by chronological occurrence when the year doesn't matter? Given a table with a date column, and given a query that selects dates in a given range of the year (like "November 20th through February 20th"), and where the year portion of the date doesn't matter (such as upcoming birthdays), how can the results be sorted by month in the correct chronological order for the selected time range?

For example, if the query grabs all dates between November 20th and February 20th regardless of year, it should sort them in the order:

Nov -&gt; Dec -&gt; Jan -&gt; Feb


But a regular sort by month actually produces:

Jan -&gt; Feb -&gt; Nov -&gt; Dec


Or an inverted sort produces:

Dec -&gt; Nov -&gt; Feb -&gt; Jan


both of which are wrong.

Here's a sample query with a three day range at the end of the year:

SELECT EventDate
   FROM Events
   WHERE TIMESTAMPDIFF(YEAR, EventDate, "2012-12-28" + INTERVAL 3 DAY)
      &gt; TIMESTAMPDIFF(YEAR, EventDate, "2012-12-28" - INTERVAL 1 DAY)
   ORDER BY DATE_FORMAT(EventDate, "%m-%d") DESC


It produces:

2012-01-01
2008-01-01
2008-01-01
1987-01-02
1994-12-28


Where it should produce:

1994-12-28
2012-01-01
2008-01-01
2008-01-01
1987-01-02


Is there a way to get it to sort by month and day in a "going forward from range start" order? 

I searched here and on SO but didn't find an answer that dealt with both year end wrapping of months and a scenario where the year in the date field isn't relevant for sorting.

Update: The range should always sort forward, so if the range is Feb to Nov, it does a standard sort of Feb - &gt; Mar -&gt; Apr .... If the range is Nov to Feb, it sorts Nov -&gt; Dec -&gt; Jan ....

Although I don't anticipate that being an issue since I don't need to query more than a 3 month window.
Test data

create table dates ( d date);
insert dates values ('2012-01-01')
,('2008-01-01')
,('2008-02-01')
,('1987-01-02')
,('1994-12-28')
,('1987-05-02')
,('1994-11-28')


Query

select d, DATE_FORMAT(d, "%m-%d") 
from dates
join (select 11 ms, 2 me) params
where ms&lt;=me and MONTH(d) between ms and me
  or ms&gt;me and (MONTH(d) &gt;=ms or MONTH(d) &lt;= me)
order by case when MONTH(d) &lt; ms then 100+MONTH(d) else MONTH(d) end