Судя по справочному руководству по MySQL 6.0 для Типы даты и времени , вы должны быть более или менее в порядке, как написано. Однако, если это действительно не работает, возможно, вы обнаружили ошибку, о которой нужно сообщить.
Значение DATE приводится к типу DATETIME путем добавления временной части как «00: 00: 00». Чтобы выполнить сравнение, игнорируя вместо этого временную часть значения DATETIME, используйте функцию CAST (), чтобы выполнить сравнение следующим образом:
date_col = CAST(NOW() as DATE);
В ваших запросах говорится '<=' 2008-12-28 '; это должно быть строго меньше, не меньше или равно. </p>
Один очень тонкий момент был бы: обрабатываются ли написанные вами выражения как DATETIME (потому что LHS является столбцом DATETIME) или как DATE (потому что RHS лучше всего обрабатывается как DATE), или, действительно, DATETIME преобразовать в строку, соответствующую RHS? Было бы важно, если бы LHS конвертировался в ДАТУ, потому что любое время 28-го числа будет в диапазоне, тогда как вы, кажется, хотите все с 21-го по 27-е. Что произойдет, если вы явно исправите типы с помощью приведений?
Кроме того, сервер MySQL работает в том же часовом поясе, что и вы? Казалось, что между тем, что вы видели, и номинальным концом дня была разница между часами? Я до сих пор не уверен, как именно это может (неправильно) работать, но это может быть иным неучтенным фактором.