我在许多表中都有一个“event_datetime”列,我需要将其截断到分钟。我不想在所有地方创建触发器以在我插入或更新时截断它,或者在我比较时不得不调用 date_trunc。是否可以有一个本质上是截断时间戳的自定义类型?
最佳答案
您可以创建 new base types in a low-level language like C .您可能不想这样做。
在 PostgreSQL 中,时间戳数据类型采用 optional precision .但将其设置为零会消除小数秒,而不是秒。
我认为你能做的最好的事情就是
- 创建一个带有检查约束的域,并且
- 要求所有插入和更新都调用一个函数。
创建域
代码如下所示。
create domain ts as timestamp
constraint no_seconds check (VALUE = date_trunc('minute', VALUE));
create table ts_test (
test_ts ts primary key
);
-- Doesn't work . . .
insert into ts_test values (current_timestamp);
ERROR: value for domain ts violates check constraint "no_seconds"
-- But this does.
insert into ts_test values (date_trunc('minute', current_timestamp));
这也允许在不调用 date_trunc()
的情况下进行比较。
为了避免将 date_trunc()
写入每个 INSERT 和 UPDATE 语句,
- 撤销对基表的“插入”和“更新”权限,
- 编写一个函数来执行截断和插入,以及
- 调用函数而不是直接使用基表。
但这只是意味着您必须在每个插入和更新语句中调用您的 函数,而不是在每个插入和更新语句中调用date_trunc()
。目前尚不清楚您是否愿意这样做。
关于postgresql - 在 postgres 中,我如何创建一个自定义类型,它只是一个截断为分钟的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45263141/