[ZODB-Dev] Transaction Timestamps

Kai Lautaportti kai.lautaportti at hexagonit.fi
Thu Feb 3 16:39:47 EST 2011


On 2011-02-03 17:37:54 +0200, Shane Hathaway said:

> FWIW, here is a way to extract timestamps from transaction IDs stored
> with RelStorage.  Kai of HexagonIT suggested it.  The timestamps should
> be in UTC.
> 
> PostgreSQL:
> 
> select
>    (tid >> 32) / 535680 + 1900 as year,
>    1 + ((tid >> 32) % 535680) / 44640 as month,
>    1 + ((tid >> 32) % 44640) / 1440 as day,
>    ((tid >> 32) % 1440) / 60 as hour,
>    ((tid >> 32) % 60) as minute,
>    (tid & 4294967295) * 60.0 / 4294967296.0 as second
>    from transaction;
> 
> MySQL:
> 
> select
>    (tid >> 32) div 535680 + 1900 as year,
>    1 + ((tid >> 32) % 535680) div 44640 as month,
>    1 + ((tid >> 32) % 44640) div 1440 as day,
>    ((tid >> 32) % 1440) div 60 as hour,
>    ((tid >> 32) % 60) as minute,
>    (tid & 4294967295) * 60.0 / 4294967296.0 as second
>    from transaction;

Thanks Shane!

Here's a slightly different version of the MySQL query that outputs 
ISO8601 formatted timestamps:

SELECT CONCAT(
    CAST(((tid >> 32) div 535680 + 1900) AS CHAR),
    '-',
    LPAD(CAST((1 + ((tid >> 32) % 535680) div 44640) AS CHAR), 2, '0'),
    '-',
    LPAD(CAST((1 + ((tid >> 32) % 44640) div 1440) AS CHAR), 2, '0'),
    'T',
    LPAD(CAST((((tid >> 32) % 1440) div 60) AS CHAR), 2, '0'),
    ':',
    LPAD(CAST(((tid >> 32) % 60) AS CHAR), 2, '0'),
    ':',
    CONCAT(LPAD(SUBSTRING_INDEX(CAST(((tid & 4294967295) * 60.0 / 
4294967296.0) AS CHAR), '.', 1), 2, '0'), '.', 
SUBSTRING_INDEX(CAST(((tid & 4294967295) * 60.0 / 4294967296.0) AS 
CHAR), '.', -1)),
    'Z') AS iso8601
FROM transaction;

- Kai




More information about the ZODB-Dev mailing list