[英]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.