PostgreSQL - Как преобразовать текущую метку времени в байты

Я перенес базу данных из SQL Server в PostgreSQL. Некоторые таблицы содержат столбец ts (timestamp), в котором хранится версия строки и который автоматически создается на сервере SQL.

Когда я преобразовал хранимые процедуры в PostgreSQL, я обнаружил, что процедуры вставки не работают, потому что столбец ts (преобразованный в bytea в PostgreSQL) равен NOT NULL, и в этот столбец не вставляется явное значение.

Теперь мне нужно реализовать то же самое в PostgreSQL. Я предполагаю, что кодирование текущего datetime в bytea каким-то образом будет работать правильно. Сообщите мне, есть ли способ реализовать это.


person Krishan Jangid    schedule 25.02.2019    source источник
comment
Я не думаю, что есть какой-либо способ преобразовать действительно очень странный тип данных временной метки SQL Server во что-либо в Postgres. Просто используйте настоящий timestamp столбец   -  person a_horse_with_no_name    schedule 25.02.2019
comment
@a_horse_with_no_name Мне удалось успешно преобразовать bytea в целое число, используя: ('x' || lpad (encode (ts :: bytea, 'hex'), 16, '0')) :: bit (64) :: bigint Разве это не может быть отменено?   -  person Krishan Jangid    schedule 25.02.2019
comment
Я думал о кодировании текущего времени эпохи (bigint) в bytea, если вышеуказанная операция может быть отменена.   -  person Krishan Jangid    schedule 25.02.2019


Ответы (1)


Для метки времени лучшим типом данных является timestamp with time zone.

Если вы хотите, чтобы он заполнялся автоматически, установите DEFAULT значение столбца на current_timestamp.

Нет ничего, что мешало бы вам сначала применить метку времени к text, а затем к bytea, но что можно получить таким образом?

Читая о типе данных timestamp Microsoft SQL Server, кажется, что все, что вам нужно, - это уникальный идентификатор для версии строки, которая изменяется при изменении строки.

В PostgreSQL это все равно происходит автоматически. Так что вам не нужен специальный столбец, просто используйте комбинацию xmin и ctid. Оба являются системными столбцами. Если любое из этих чисел изменилось, строка была изменена.

person Laurenz Albe    schedule 25.02.2019
comment
timestamp SQL Server - это все, кроме отметки времени. Название полная ерунда. Это какая-то версия внутренней строки, закодированная в двоичном формате. Может быть, он содержит временную метку в качестве входных данных, но, несмотря на совершенно запутанное имя, это не имеет ничего общего с реальной временной меткой. - person a_horse_with_no_name; 25.02.2019
comment
Спасибо за объяснение, оно позволило мне сделать ответ более полезным. - person Laurenz Albe; 25.02.2019
comment
@LaurenzAlbe, использование системного столбца для этого имеет смысл. Однако не могли бы вы объяснить причину использования комбинации xmin и ctid? Будет ли проблема, если я просто использую xmin? - person Krishan Jangid; 26.02.2019