У меня есть эта схема
CREATE TABLE 'test' (
'id' int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
'dt' datetime NOT NULL
) ENGINE='InnoDB';
INSERT INTO 'test' ('dt') VALUES ('2018-02-19 17:21:51.321343');
почему нет результата для этого запроса?
select * from test where dt = '2018-02-19 17:21:51.321343';
поэтому я использую datetime, а не datetime (6).. часть микросекунд не сохраняется, почему ее сравнивают?
http://sqlfiddle.com/#!9/bed0c3/3
Спасибо
Из вашего запроса нет результата, потому что вы сравниваете значение, хранящееся в таблице, с другим значением. Они не совпадают, поэтому выражение поиска ложно.
Сравнение времени без микросекунд против времени с микросекундами ложно:
mysql> select '2018-02-19 17:21:51' = '2018-02-19 17:21:51.321343' as is_equal;
+----------+
| is_equal |
+----------+
| 0 |
+----------+
Точно так же, как сравнение между pi и integer ложно:
mysql> select 3.1415927 = 3 as is_equal;
+----------+
| is_equal |
+----------+
| 0 |
+----------+
Вы можете решить эту проблему, добавив значение дробного значения datetime в единицу без миллисекунд:
mysql> select '2018-02-19 17:21:51' = cast('2018-02-19 17:21:51.321343' as datetime) as is_equal;
+----------+
| is_equal |
+----------+
| 1 |
+----------+
Кастинг как datetime
- это то же самое, что и литье в datetime(0)
. То есть 0 цифр дробных секунд.
Повторите свой комментарий.
Подумайте об этом так: вы ищете ценность. Значение, которое вы ищете, не сохраняется в таблице. Таким образом, поиск не удался. Разве это не логично?
dt
имеет типdatetime
? даже если запрашивается, он возвращает только часть даты и времени без мили / микросекунд.dt
указан INDEX. Есть идеи почему? sqlfiddle.com/#!9/69dfe/1