Почему включение часового пояса в запрос MySQL DATETIME с VIEW делает дробные секунды не эквивалентными? - PullRequest
1 голос
/ 02 апреля 2020

У меня есть MySQL 8 DB с полем DATETIME(4), и я столкнулся со странным случаем вокруг эквивалентности в VIEW. Я работал над этим, но я не уверен, почему это происходит, и я хотел бы понять, почему.


У меня есть таблица с полем: date_time DATETIME(4). У меня есть ПРОСМОТР, где я превращаю это обратно в строку ISO8601, используя DATE_FORMAT(date_time, '%Y-%m-%dT%T.%fZ') as date_time.

Если я вставляю строку с датой, такой как 2017-04-22T20:47:05.33523Z, а затем следующий запрос не может найти строку, и я ' Я не уверен, почему.

select * from EXAMPLE_VIEW where date_time >= '2017-04-22T20:47:05.335Z';

Работают следующие:

select * from EXAMPLE where date_time >= '2017-04-22T20:47:05.335Z';
select * from EXAMPLE where date_time >= '2017-04-22T20:47:05.335';
select * from EXAMPLE where date_time >= '2017-04-22T20:47:05.3350Z';

select * from EXAMPLE_VIEW where date_time >= '2017-04-22T20:47:05.335';
select * from EXAMPLE_VIEW where date_time >= '2017-04-22T20:47:05.3350Z'

Минимальный пример здесь: https://www.db-fiddle.com/f/ak7LTLzH7UJGgmPWS85dRE/1

1 Ответ

1 голос
/ 02 апреля 2020

Ваша проблема в том, что при выполнении сравнения в VIEW вы сравниваете как строки , а не даты . Когда вы форматируете дату и время с помощью %f, вы получаете 6 цифр микросекунд, т.е. 2017-04-22T20:47:05.335200Z. Поскольку вы сравниваете это как строку, сравнение >= с '2017-04-22T20:47:05.335Z' не удается, поскольку 2 меньше Z.

Причина, по которой этот тест работает в запросе 1, заключается в том, что '2017-04-22T20:47:05.335Z' преобразуется в дату (что приводит к 2017-04-22T20:47:05.335000Z) перед сравнением, а это меньше, чем 2017-04-22T20:47:05.335200Z.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...