2017-02-15 5 views
1

Если бы немного неинтуитивный случай прямо сейчас с MySQL:
запрос содержит пункт, где со сравнением: WHERE t.date = '2016-12-31' (! T.date-s типа данных DATE()) .. И это не возвращает никаких записей о выполнение. Но запрос: WHERE t.date > '2016-12-31' - возвращает записи с date равно '2016-12-31' среди других записей! Запись на 2016-12-31 также появилась в случае, если я использовал BETWEEN '20161231' AND '20170101'. Пробовал форматирование, изменения типа - ничего не помогало. После некоторого времени, затраченного на поиск причины, я сделал следующее: обновил столбец записи date вручную, установив его в «2016-12-31». После этого действия WHERE t.date = '2016-12-31' начал работать должным образом.
Наверное, мне что-то не хватает, интересно, что может вызвать такое поведение.
Update
дата DATE, DATETIME не DATE сравнение типа в MySQL

После выполнения обновления вручную я не могу воспроизвести упомянутое поведение снова: теперь любой тип сравнения (=, DATE (..) =, STRCMP) - работает как надо!
Обновление 2
Для 2016-11-30 и 2016-09-30 (конец месяца!) Найдено то же поведение! Не будем обновлять запись вручную, чтобы проверить те предложения, которые я здесь получаю.
Обновление 3
Я также запустил OPTIMIZE TABLE в таблице с этим столбцом даты, чтобы перестроить индексы для устранения любых проблем с коррупцией.
Update 4
Вот еще:
, если я проверю значение HEX для поля даты для некорректных полей (конца месяца) я получаю неправильные значения!
SELECT HEX(t.date) FROM table t WHERE t.date BETWEEN DATE('20160930') AND DATE('20161001');
Возвращает:
323031362D31302D3030
323031362D31302D3031
SELECT HEX(DATE('20160930'));
Returns:
323031362D30392D3330
И 323031362D30392D3330 = 323031362D31302D3030
SELECT X'323031362D31302D3030';
И возвращается:
2016-10-00, НЕ 2016- 09-30!
Для значения, которое я обновил вручную - HEX - это то же самое.
Но что может вызвать такую ​​разницу?

+1

Уверен, что это не DATETIME? –

+0

Не могли бы вы отформатировать запросы немного лучше, в идеале, как полные блоки кода? –

+1

Действительно ли вы на 100% уверены, что поле имеет тип DATE, а не DATETIME? – Nate

ответ

1

После некоторого исследования я нашел эту проблему и ее не связаны напрямую к сопоставлению даты в MySQL. Я отправлю его здесь, если кто-нибудь застрял в таком случае.
Я обнаружил, что проблема заключалась в выборе результатов в IDE (в моем случае DataGrip): значение для поля даты в базе данных было 2016-10- и выбрано было возвращение 2016-09-30! Это было непонятно. Но после того, как был найден ДЕНЬ 00 - было относительно легко найти причину этого: CURDATE() - 1 (в моем случае должно было быть: CURDATE() - INTERVAL 1 DAY). Никогда не используйте функции, связанные с датой, без специальных функций, таких как INTERVAL !!
Спасибо всем, кто поддержал этот вопрос, извините за путаницу, я тоже смутился и нашел ответ только после нескольких шагов.

1

Попробуйте принуждая формат, используя

WHERE date(t.date) = '2016-12-31' 

или

WHERE date(t.date) = str_to_date('2016-12-31', '%Y-%m-%d') 

или на основе теста

WHERE date(t.date) = str_to_date('20161231', '%Y%m%d') 
+0

Пробовал оба, ни один не помог. Также попробовал STRCMP. – 0x49D1

+0

Что вы использовали для обновления вручную записей? – scaisEdge

+0

UPDATE table SET date = '20161230' WHERE ID = ... и после этого - назад до 31: таблица UPDATE SET date = '20161231' WHERE ID = ... – 0x49D1

Смежные вопросы