PostgreSQL:在插入/更新timestamptz列时需要显式的时区



我正在深入研究Postgres的工作方式,并决定我的数据库中的任何日期/时间数据都应该是timestamptz数据类型。

管理Postgres如何解析日期/时间信息的规则根据服务器的时区、客户端会话时区和/或数据库时区设置而变化。我不能指望我的开发人员知道所有这些,所以为了避免任何歧义,我希望在某种程度上要求在对timestamptz列的任何INSERT或UPDATE中指定时区,并且当timestamptz列的输入值没有显式地包括时区时,任何UPDATES或INSERTS都会失败。我已经创建了一个正则表达式,我可以使用它来匹配输入值;我就是不知道怎么接上水管。

我首先想到我可以用一个自定义域来做到这一点;但是,似乎域上的CHECK约束是在输入字符串已经被解析之后完成的,因此这将不起作用。(到那时,服务器已经推断出没有显式包含时区的值的时区。)

我可以使用自定义数据类型,但这是一个完整的问题,我不确定这样做是否会保留所有操作在下面的timstamptz列上操作的操作符和函数。

我可以使用BEFORE INSERT和BEFORE UPDATE触发器,但这样做需要我遍历NEW记录中的每一列,确定其数据类型,然后根据正则表达式检查值以确保指定了时区。

社区对如何实现这一目标有什么想法吗?我认为BEFORE INSERT/BEFORE UPDATE可能是做这项工作的最佳位置,但我不知道如何迭代新记录并找到每列的数据类型。

有没有我错过的更简单的方法来完成这个?

我不能指望我的开发人员知道所有这些

我想那是你的问题。如果你想使用PostgreSQL并处理时区,你需要你的开发人员理解它。

这一切都很简单:只有为客户端会话正确设置timezone参数,然后一切都会正常工作。

最新更新