PostgreSQL - 如何将当前时间戳转换为bytea

3
我已将一个数据库从SQL Server迁移到了PostgreSQL。许多表包含一个ts列(timestamp),用于存储行版本并在SQL Server中自动生成。
当我将存储过程转换为PostgreSQL时,我发现插入过程失败了,因为ts列(在PostgreSQL中转换为bytea)是NOT NULL的,并且没有在该列中插入明确的值。
现在,我需要在PostgreSQL中实现相同的功能。我假设将当前日期时间编码为bytea会起作用。如果有实现这个的方法,请告诉我。

我认为没有任何办法将 SQL Server 中真的,真的奇怪的“timestamp”数据类型转换成 Postgres 中的任何东西。只需使用一个真正的timestamp列即可。 - user330315
@a_horse_with_no_name 我成功地将 bytea 转换为整数,使用以下方法: ('x'||lpad(encode(ts::bytea, 'hex'), 16, '0'))::bit(64)::bigint它不能反转吗? - Krishan Jangid
如果上述操作可以恢复,我想将当前的时代时间(bigint)编码为bytea。 - Krishan Jangid
1个回答

1
对于时间戳,timestamp with time zone 是最好的数据类型。
如果你想让它自动填充,将列的 DEFAULT 值设置为 current_timestamp
没有任何东西阻止你先将时间戳转换为 text,然后再转换为 bytea,但这样有什么好处呢?
阅读有关 Microsoft SQL Server 的 timestamp 数据类型的信息,似乎你只需要一个唯一标识符来表示行版本,每当修改行时它都会更改。
在 PostgreSQL 中,这种情况已经自动发生了。所以你不需要一个特殊的列,只需使用 xminctid 的组合即可。两者都是系统列。如果这些数字中的任何一个发生变化,则表示行已被修改。

2
SQL Server的“timestamp”与时间戳毫无关系。这个名字完全是胡说八道。它是一种以二进制编码的内部“行版本”。也许它的输入是以时间戳为种子,但尽管这个名字非常令人困惑,它与真正的“时间戳”没有任何关系。 - user330315
谢谢您的解释,它让我的回答更有用了。 - Laurenz Albe
@LaurenzAlbe,对于这个问题使用系统列是有意义的。但是,您能否解释一下为什么要使用xminctid的组合呢? 如果我只使用xmin会有什么问题吗? - Krishan Jangid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接