Not the 1st one as it perform unnecessary (unless you really have such unprocessed data) truncate.
1. trunc(created_at_date) between '2014-06-01' and '2014-06-30';
Definitely not this one for obvious reasons (like)
2. created_at_date like '2014-06%'
May be this one:
3. created_at_date >= '2014-06-01 00:00:00' and created_at_date <= '2014-06-30 23:59:59'
However, since the requirement is to generate monthly reports which I would assume to be a recurring task and on multiple data sources, I would suggest creating a one time calendar table.
This table would have mapping of a date to a month value and then you can simply join your source data with that table and group by the "month" column.
P.S. Just realized I replied to a very 'ancient' question :p