postgresql - 在 postgres 中,我如何创建一个自定义类型,它只是一个截断为分钟的时间戳

标签 postgresql user-defined-types

我在许多表中都有一个“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/

相关文章:

postgresql - Postgres - 如何将输出返回到终端?

postgresql - PostgreSQL 中的空间数据

postgresql - 有没有办法在 windows cli 中使用 'COPY' 命令(PostgreSQL)?

oracle - 简单类型别名 - Oracle 最佳实践

sql - 无法修改用户定义的表类型

sql-server - 内存中用户定义表,不在内存中?

bash - 是否可以在 psql 中组合 `-c` 和 `-v`?

python - SQLAlchemy 可以使用 PostgreSQL 的 "from only"子句吗?

sql - 选择带别名和不带-oracle 11g 有什么区别

oracle - 在 ODP.NET(用户定义类型)中使用 Oracle UDT 时出现奇怪问题