Spec-Zone.ru › MariaDB

Микросекунды в 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
    
  • Текущие версии этого исправления устраняют ошибку в следующем оптимизации: в некоторых запросах с DISTINCT MariaDB может игнорировать это условие, если может доказать, что все строки результата уникальны, например, когда первичный ключ сравнивается со значением константы. Иногда эта оптимизация применялась неправильно, например, при сравнении строки с постоянной датой. Это теперь исправлено.
  • 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 требует немного больше места хранения, но имеет некоторые преимущества, позволяющие в конечном итоге поддерживать отрицательные даты и репликацию.

См. также

  • Требования к хранению типов данных
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно MariaDB. Мнения, информация и мнения, выраженные в этом содержимом, не обязательно отражают позиции MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API