Соединение / сравнение MySQL для столбца DATETIME (<5.6.4 и> 5.6.4)
Предположим, у меня есть две таблицы, например:
Events
ID (PK int autoInc), Time (datetime), Caption (varchar)
Position
ID (PK int autoinc), Time (datetime), Easting (float), Northing (float)
Безопасно ли, например, перечислять все события и их положение, если я использую Time
поле как мой критерий присоединения? То есть:
SELECT E.*,P.* FROM Events E JOIN Position P ON E.Time = P.Time
ИЛИ, даже просто сравнивая значение datetime (принимая во внимание, что параметризованное значение может содержать часть долей секунд - которую MySQL всегда принимал), например
SELECT E.* FROM Events E WHERE E.Time = @Time
Я понимаю, что MySQL (до версии 5.6.4) хранит только поля даты и времени БЕЗ миллисекунд. Так что я бы предположил, что этот запрос будет работать нормально. Однако, начиная с версии 5.6.4, я прочитал, что MySQL теперь может хранить миллисекунды с полем datetime.
Предполагая, что значения даты и времени вставляются с использованием таких функций, как NOW()
, миллисекунды усекаются (<5.6.4), что, как я полагаю, позволит работать вышеупомянутому запросу. Однако с версией 5.6.4 и новее это потенциально НЕ может работать. Я и только когда-либо будет заинтересован во второй точности.
Если кто-то может ответить на следующие вопросы, будет принята с благодарностью:
- В общем, как MySQL сравнивает поля datetime друг с другом (рассмотрите вышеупомянутый запрос).
- Хорошо ли приведенный выше запрос и использует ли он индексы для полей времени? (MySQL <5.6.4)
- Есть ли способ исключить миллисекунды? Т.е. при вставке и в условных объединениях / выделениях и т.д? (MySQL> 5.6.4)
- Будет ли работать запрос на присоединение выше? (MySQL> 5.6.4)
РЕДАКТИРОВАТЬ
Я знаю, что могу разыграть datetime, спасибо за ответы, но я пытаюсь решить корень проблемы здесь (тот факт, что тип / определение хранилища был изменен), и я НЕ хочу использовать функции в моем запросы. Это сводит на нет всю мою работу по оптимизации запросов с применением индексов и т. Д., Не говоря уже о необходимости переписывать все мои запросы.
EDIT2
Может ли кто-нибудь предложить причину НЕ присоединиться к DATETIME
поле с использованием второй точности?
2 ответа
Кажется, что разработчики MySQL не хотели нарушать обратную совместимость, поэтому, чтобы использовать миллисекунды, вам явно нужно изменить таблицы, sql и т. Д., Чтобы использовать эту функцию:
http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
СООБЩЕНИЕ ([FSP])
Начиная с MySQL 5.6.4, если задан аргумент fsp, указывающий точность в долях секунды от 0 до 6, возвращаемое значение включает в себя часть долей секунд в этом количестве цифр. До 5.6.4 любой аргумент игнорируется.
http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
MySQL 5.6.4 и выше расширяет поддержку доли секунды для значений TIME, DATETIME и TIMESTAMP с точностью до микросекунд (6 цифр):
Чтобы определить столбец, который включает часть долей секунд, используйте синтаксис type_name(fsp), где type_name - это TIME, DATETIME или TIMESTAMP, а fsp - точность долей секунд. Например:
CREATE TABLE t1 (t TIME(3), dt DATETIME(6)); The fsp value, if given, must be in the range 0 to 6. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0. (This differs from the standard SQL default of 6, for compatibility with previous MySQL versions.)
Попробуйте этот запрос. Для вопросов 3 и 4 это будет работать нормально. Тем не менее не рекомендуется использовать поле времени для объединений.
SELECT E.*,P.* FROM Events E JOIN Position P ON date(E.Time) = date(P.Time)
Хотя я дал вам решение, но вам будет запрещено вставлять одно и то же время в разные таблицы. Тогда вы сможете сравнить, но это довольно сложно, потому что в то же время вы не можете запустить два запроса на вставку. Таким образом, вам придется сделать некоторую работу по меню для этого. Если вы хотите прочитать больше, прочитайте эту статью.
http://billauer.co.il/blog/2009/03/mysql-datetime-epoch-unix-time/