簡體   English   中英

如何在MySQL的Unix紀元中將日期時間以毫秒精度轉換為毫秒?

[英]How to convert datetime with millisecond precision to milliseconds from Unix epoch in MySQL?

我有一個表,其中的日期列格式為DATETIME(3) 我想將其轉換為BIGINT(13) ,該日期時間將以unix紀元為毫秒單位存儲。

如何修改列定義並轉換表中的所有現有值而又不丟失任何數據?

我知道您可以使用時區將datetime轉換為毫秒:

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`),
);

您是否正在使用MySQL 5.6或更高版本? 如果是這樣,在鼓勵您轉換表之前,我建議您考慮簡單地將datetime列定義更改為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否則會出現錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM