Микросекунды в MariaDB
Типы TIME, DATETIME и TIMESTAMP, а также временные функции CAST и динамические столбцы, поддерживают микросекунды. Точность даты и времени столбца можно указать при создании таблицы с помощью CREATE TABLE, например:
CREATE TABLE example( col_microsec DATETIME(6), col_millisec TIME(3) );
В целом, точность может быть указана для любого TIME, DATETIME, или TIMESTAMP столбца в скобках после имени типа. Точность даты и времени задаёт количество цифр после десятичной точки и может быть целым числом от 0 до 6. Если точность не указана, предполагается, что она равна 0, для обеспечения обратной совместимости.
Точность даты и времени можно указать там, где используется имя типа. Например:
- при объявлении аргументов хранимых процедур.
- при указании возвращаемого типа хранимой функции.
- при объявлении переменных.
- в функции
CAST:create function example(x datetime(5)) returns time(4) begin declare y timestamp(6); return cast(x as time(2)); end;
%f используется в качестве опции форматирования микросекунд в функциях STR_TO_DATE, DATE_FORMAT и FROM_UNIXTIME, например:
SELECT STR_TO_DATE('20200809 020917076','%Y%m%d %H%i%s%f');
+-----------------------------------------------------+
| STR_TO_DATE('20200809 020917076','%Y%m%d %H%i%s%f') |
+-----------------------------------------------------+
| 2020-08-09 02:09:17.076000 |
+-----------------------------------------------------+
Дополнительная информация
- при сравнении чего-либо со временной величиной (
DATETIME,TIME,DATE, илиTIMESTAMP), оба значения сравниваются как временные значения, а не как строки. - В таблице INFORMATION_SCHEMA.COLUMNS появился новый столбец
DATETIME_PRECISION -
NOW(), CURTIME(), UTC_TIMESTAMP(), UTC_TIME(), CURRENT_TIME(), CURRENT_TIMESTAMP(), LOCALTIME() и LOCALTIMESTAMP() теперь принимают точность даты и времени в качестве необязательного аргумента. Например:
SELECT CURTIME(4); --> 10:11:12.3456
-
TIME_TO_SEC() и UNIX_TIMESTAMP() сохраняют микросекунды аргумента. Эти функции вернут десятичное число, если точность результата отлична от нуля, и целое число в противном случае (для обратной совместимости).
SELECT TIME_TO_SEC('10:10:10.12345'); --> 36610.12345 - Текущие версии этого исправления устраняют ошибку в следующем оптимизации: в некоторых запросах с
DISTINCTMariaDB может игнорировать это условие, если может доказать, что все строки результата уникальны, например, когда первичный ключ сравнивается со значением константы. Иногда эта оптимизация применялась неправильно, например, при сравнении строки с постоянной датой. Это теперь исправлено. -
DATE_ADD()иDATE_SUB()функции теперь могут принимать выражениеTIMEв качестве аргумента (а не толькоDATETIMEкак раньше).SELECT TIME('10:10:10') + INTERVAL 100 MICROSECOND; --> 10:10:10.000100 - Поле
event_timeв таблице mysql.general_log и поляstart_time,query_time, иlock_timeв таблице mysql.slow_log теперь хранят значения с точностью до микросекунд. - Это исправление устранило ошибку при сравнении временного значения с использованием оператора
BETWEENи когда один из операндов являетсяNULL. - Старый синтаксис
TIMESTAMP(N), гдеN— ширина отображения, больше не поддерживается. Он был устаревшим в MySQL 4.1.0 (выпущен 2003-04-03). - при сравнении значения
DATETIMEсо значениемTIME, последнее рассматривается как полная дата и время с нулевой частью даты, аналогично сравнениюDATEсDATETIME, или сравнениюDECIMALчисел. Более ранние версии MariaDB сравнивали только временную часть обоих операндов в таком случае. - В MariaDB был добавлен дополнительный столбец
TIME_MSв таблицуINFORMATION_SCHEMA.PROCESSLIST, а также в выводSHOW FULL PROCESSLIST.
Примечание: При преобразовании временного значения в значение с меньшей точностью оно будет усечено, а не округлено. Это делается для гарантии, что часть даты не изменится. Например:
SELECT CAST('2009-12-31 23:59:59.998877' as DATETIME(3));
-> 2009-12-31 23:59:59.998
Микросекунды в MySQL 5.6
MySQL 5.6 ввёл микросекунды с помощью несколько другой реализации по сравнению с MariaDB 5.3. Начиная с MariaDB 10.1, MariaDB по умолчанию использует формат MySQL, посредством переменной --mysql56-temporal-format. Версия MySQL требует немного больше места хранения, но имеет некоторые преимущества, позволяющие в конечном итоге поддерживать отрицательные даты и репликацию.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/microseconds-in-mariadb/