Основное недоразумение в MySQL с метками времени состоит в том, что MySQL по умолчанию возвращает и сохраняет метки времени без дробной части .
SELECT current_timestamp() => 2018-01-18 12:05:34
, которое можно преобразовать в метку времени в секундах как
SELECT UNIX_TIMESTAMP(current_timestamp()) => 1516272429
Добавить дробную часть:
SELECT current_timestamp(3) => 2018-01-18 12:05:58.983
, которая может быть преобразована в метку времени в микросекундах как
SELECT CAST( 1000*UNIX_TIMESTAMP(current_timestamp(3)) AS UNSIGNED INTEGER) ts => 1516272274786
Есть несколько трюков с хранением в таблицах. Если ваша таблица была создана как
CREATE TABLE `ts_test_table` (
`id` int(1) NOT NULL,
`not_fractional_timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
чем MySQL НЕ будет хранить в нем дробную часть:
id, not_fractional_timestamp
1, 2018-01-18 11:35:12
Если вы хотите добавить дробную часть в вашу таблицу, вам нужно создать свою таблицу другим способом:
CREATE TABLE `ts_test_table2` (
`id` int(1) NOT NULL,
`some_data` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
`fractional_timestamp` timestamp(3) NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
, что приводит к требуемому результату:
id, some_data, fractional_timestamp
1, 8, 2018-01-18 11:45:40.811
функция current_timestamp () может получать значение до 6, но я обнаружил (по крайней мере, в моей установленной версии MySQL 5.7.11 для Windows), что точность дроби 6 приводит к тому же постоянному значению 3 цифры в хвост, в моем случае 688
id, some_data, fractional_timestamp
1, 2, 2018-01-18 12:01:54.167688
2, 4, 2018-01-18 12:01:58.893688
Это означает, что реально используемая точность меток времени MySQL зависит от платформы: