Поэтому мне интересно, столкнулся ли я с ошибкой, которая должна быть более или менее очевидной.
Итак, скажем, у нас есть поле БД с именем dateField
, которое находится в дате и времени. Предположим также, что все записи в таблице имеют это значение: 2013-10-15 13:15:46
.
Теперь мы хотели бы извлечь записи в диапазоне дат. Мы используем формат 2013-10-15 (yyyy-mm-dd
) во внешнем интерфейсе веб-сайта. (Нет, SQL-инъекция НЕвозможна. Она проходит через PDO. :D)
Давайте также предположим, что оператор select вставляется следующим образом: $select->where('dateField >= ?', $dateFrom); $select->where('dateField ‹= ?', $dateTo);
Итак, когда у нас есть такой диапазон:
От: 10.10.2013 До: 16.10.2013 все в порядке.
Но с таким выражением: От: 15.10.2013 До: 15.10.2013 результатов не будет! :D
Я предполагаю, что MySQL внутренне преобразует мой тип даты 2013-10-15 в 2013-10-15 00:00:00 и мой WHERE пункт становится:
SELECT .... WHERE dateField <= 2013-10-15 00:00:00 AND dateField >= 2013-10-15 00:00:00;
Конечно, в данном случае 2013-10-15 13:15:46 НЕ находится в моем предложении WHERE. :Д :Д
Я уже исправил это, сравнив только часть даты:
$select->where('DATE(dateField) >= ?', $dateFrom);
$select->where('DATE(dateField) <= ?', $dateTo);
Но мои вопросы:
Может ли кто-нибудь объяснить немного больше о внутренних преобразованиях даты/даты и времени MySQL (операции низкого уровня)?
Является ли этот вопрос хорошим дополнением к вики сообщества?