我正在尝试解码 mysql 中的 uuid,以识别有助于准备日期部分的数字。 例如
uuid ==> b54adc00-67f9-11d9-9669-0800200c9a66
上面的uuid中的日期部分是什么?
我想也许你正在寻找这样的东西:
select uuid AS uid
, from_unixtime(
(conv(
concat(
substring(uuid, 16, 3)
, substring(uuid, 10, 4)
, substring(uuid, 1, 8)
), 16, 10)
div 10 div 1000 div 1000
) - (141427 * 24 * 60 * 60)
) AS uuid_to_timestamp
, current_timestamp() AS timestamp
from test ;
https://www.db-fiddle.com/f/4uegQFAyd1NyuSme7F2JwX/1
参考:https://rpbouman.blogspot.com/2014/06/mysql-extracting-timstamp-and-mac.html?m=0
这只适用于变体 1 类型的 uuid。 对于过时的变体0或很少使用的变体2,需要修改,其他变体不包含日期;该变体存储在 uuid 中(除非它是完全随机的),但我没有检查它。
假设uuid是字符串形式的uuid:
select '1582-10-15'
+ interval floor(
conv(
concat(
substr(uuid,16,3),
substr(uuid,10,4),
substr(uuid,1,8)
),
16,
10
)
/1e7
) second
这会产生 UTC 格式的日期时间;如果您在当地时区需要它,请像这样转换:
convert_tz(
'1582-10-15' + interval floor(conv(concat(substr(uuid,16,3),substr(uuid,10,4),substr(uuid,1,8)),16,10)/1e7) second,
'+00:00',
'America/Los_Angeles'
)
如果您只想要日期,请将以上其中一项包裹在
DATE( ... )
中。
对于存储为 BIN(16) 的 MariaDB 和 UUIDv7,您可以使用以下函数:
DELIMITER $$
CREATE DEFINER=`ksn135`@`localhost` FUNCTION `ts_from_uuid`(`b` BINARY(16)) RETURNS timestamp
BEGIN
RETURN FROM_UNIXTIME(
CAST(
CONV(
SUBSTRING(HEX(b),1,12),
16,
10
)
/ 1000 AS UNSIGNED
)
);
END$$
DELIMITER ;
用途:
SELECT id, mysql.ts_from_uuid(id) FROM table1;