MySQL не хранит микросекунды в datetime, но использует в где условия?

0

У меня есть эта схема

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

Спасибо

Теги:
datetime

1 ответ

0

Из вашего запроса нет результата, потому что вы сравниваете значение, хранящееся в таблице, с другим значением. Они не совпадают, поэтому выражение поиска ложно.

Сравнение времени без микросекунд против времени с микросекундами ложно:

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 цифр дробных секунд.


Повторите свой комментарий.

Подумайте об этом так: вы ищете ценность. Значение, которое вы ищете, не сохраняется в таблице. Таким образом, поиск не удался. Разве это не логично?

  • 0
    Спасибо, зачем это нужно, когда столбец dt имеет тип datetime ? даже если запрашивается, он возвращает только часть даты и времени без мили / микросекунд.
  • 0
    Спасибо @Bill, это имеет смысл .. Я запутался из-за того факта, что запрос на самом деле возвращает данные, если в столбце dt указан INDEX. Есть идеи почему? sqlfiddle.com/#!9/69dfe/1
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню