??? I don't understand.
EVERY ONE of those records has ONE of the events in April.
So it is indeed selecting the correct records.
Do you mean you only want to *DISPLAY* the word "APRIL"???
If so, you don't even need to pay attention to the query results. You *KNOW* that the query will only get you records where one of the dates is in April, so just put "APRIL" at the top of your page and you are done.
But in any case, it is *YOUR CODE* that is showing the month and day:
You are TELLING MySQL that you want the date in that format! If you want a different format, then change the '%M %d' to what you want.
DATE_FORMAT(contacts.`birthdate`, '%M %d') as 'BIRTHDATE',
DATE_FORMAT(contacts_cstm.`anniversary_c`, '%M %d') as 'ANNIVERSARIES',
DATE_FORMAT(contacts_cstm.`spousebirthdate_c`, '%M %d') as 'SPOUSE BIRTHDAY',