从MYSQL中的UUID中提取日期

问题描述 投票:0回答:3

我正在尝试解码 mysql 中的 uuid,以识别有助于准备日期部分的数字。 例如

uuid ==> b54adc00-67f9-11d9-9669-0800200c9a66

上面的uuid中的日期部分是什么?

mysql uuid
3个回答
2
投票

我想也许你正在寻找这样的东西:

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


2
投票

这只适用于变体 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( ... )
中。


0
投票

对于存储为 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;
© www.soinside.com 2019 - 2024. All rights reserved.