Как преобразовать дату и время с точностью до миллисекунды в миллисекунды из эпохи Unix в MySQL? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть таблица со столбцом даты, который отформатирован как DATETIME(3).Я хотел бы преобразовать его в BIGINT(13), в котором эта дата и время хранятся как миллисекунды с эпохи Unix.

Как я могу изменить определение столбца и преобразовать все существующие значения в таблице, не теряя ни одного изданные?

Я знаю, что вы можете преобразовать дату и время в миллисекунды, используя часовой пояс:

SELECT CAST(
  UNIX_TIMESTAMP(
    CONVERT_TZ('2019-04-22 00:37:47.843', '+00:00', 'SYSTEM')
  ) * 1000 AS INT
);

Что возвращает: 1555893467843

Таблица создана кактакие:

CREATE TABLE `usages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(36) NOT NULL,
  `datetime` datetime(3) NOT NULL,
  PRIMARY KEY (`id`),
);

Хотелось бы, чтобы это выглядело так:

CREATE TABLE `usages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(36) NOT NULL,
  `unix` bigint(13) NOT NULL,
  PRIMARY KEY (`id`),
);

1 Ответ

1 голос
/ 23 апреля 2019

Вы используете MySQL 5.6 или выше? Если это так, перед преобразованием вашей таблицы я бы рекомендовал вам просто изменить определение столбца даты и времени на datetime(6), которое будет изначально поддерживать хранение миллисекунд. Подробнее об этом здесь: Метка времени с точностью до миллисекунды: как сохранить их в MySQL

Если вы все еще хотите изменить таблицу, вы можете сделать это следующим образом:

1) Переименуйте таблицу:

RENAME TABLE `usages` TO `usages_original`;

2) Создайте usages по желанию:

CREATE TABLE `usages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(36) NOT NULL,
  `unix` bigint(13) NOT NULL,
  PRIMARY KEY (`id`),
);

3) Вставьте ваши измененные данные:

INSERT INTO `usages`
SELECT `id`, `uuid`,
    UNIX_TIMESTAMP(CONVERT_TZ(`datetime`, '+00:00', 'SYSTEM')) * 1000
FROM `usages_original`

4) При желании удалить переименованную таблицу: DROP usages_original

Примечание: Я не думаю, что CAST() здесь необходимо, но если вы действительно хотите привести к целому числу, вместо этого должно быть CAST expr AS UNSIGNED, иначе вы получите ошибку.

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