Вручную преобразовать двоичный формат PostgreSQL временной метки в целое число - PullRequest
0 голосов
/ 13 февраля 2019

Я читал, что PostgreSQL внутренне хранит временные метки как 8-байтовое / 64-битное целое число.

Чтобы проверить это, я создал таблицу, вставил несколько временных меток и запросил heap_page_items.
Выходные данные, например, для отметки времени 2019-01-08 09:00:00 были 00 e4 c2 56 ed 21 02 00.

Учитывая эту шестнадцатеричную последовательность, как мне вручную вычислить количество микросекунд с начала эпохи PostgreSQL (2000-01-01)?Используя конвертер меток времени, я получил значение 600253200000 в качестве результата.Как мне распаковать байты, чтобы получить это значение?

1 Ответ

0 голосов
/ 14 февраля 2019

Ваш анализ почти идеален, и вы должны быть на машине с прямым порядком байтов.

Вам не нужно распаковывать значение, потому что в вашей 64-битной архитектуре 8-байтовые целые числа могут вписываться вa PostgreSQL Datum.

SELECT extract(epoch FROM TIMESTAMP '2019-01-08 09:00:00')
     - extract(epoch FROM TIMESTAMP '2000-01-01 00:00:00');

 ?column?  
-----------
 600253200
(1 row)

600253200 секунд - 600253200000000 микросекунд.

Целое число, которое вы видите в таблице, равно 0x000221ed56c2e400, что соответствует десятичному 600253200000000:

bash> printf "%ld\n" 0x000221ed56c2e400
600253200000000
...