It is very complicated, unless you use unix timestamps (which make everything very easy).
Store the date in your database as a unix timestamp (varchar col type). Then you can just use strtotime to get the upper and lower limits.
For instance, if you wanted to find everything that is 1 month old, you could do:
$result = mysql_query("SELECT * FROM table WHERE table_date < " . strtotime("now -1 month") );
or if you wanted everything between the first of the year and the middle of the year:
$result = mysql_query("SELECT * FROM table WHERE table_date < " . strtotime("2003/6/1") . " AND table_date >= " . strtotime("2003/1/1") );
Then when you want to output a date on a report, you just use date().