The following is wrong because it leaves out one entire second of the day...
BETWEEN '2006-05-01 00:00:00.000' AND '2006-05-01 23:59:59.000'
...depending on the source of the data, there could be thousands of records in that one second.
Kenneth is absolutely correct in implying that the other BETWEEN scenarios are wrong because if you have any date with "no times" from the next day, they will erroneously be included.
The proper way to do this and still have indexes kick in when available is...
WHERE somedatecolumn >= '2006-05-01'
AND somedatecolumn < '2006-05-02'