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

时间:2017-07-23 08:38:58

标签: postgresql user-defined-types

我在许多表中都有一个“event_datetime”列,我需要将其截断为分钟。我不想在所有地方创建触发器,以便在插入或更新时截断它,或者在比较时不得不调用date_trunc。是否可以拥有一个基本上是时间戳截断的自定义类型?

1 个答案:

答案 0 :(得分:2)

您可以创建new base types in a low-level language like C。你可能不想这样做。

在PostgreSQL中,时间戳数据类型需要optional precision。但是将其设置为零可以消除小数秒,而不是秒。

我认为你能做的最好就是

  • 使用检查约束创建域
  • 要求所有插入和更新调用函数。

create domain代码如下所示。

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语句,

  • 撤销'插入'并且'更新'基表上的权限,
  • 编写一个函数来执行截断和插入,以及
  • 调用函数而不是直接使用基表。

但这只是意味着您必须在每个insert和update语句中调用您的函数,而不是在每个insert和update语句中调用date_trunc()。目前尚不清楚你是否愿意这样做。