Postgresql 中的间隔字段

Interval field in Postgresql

这些命令有什么区别?

ALTER TABLE podcast_episodes ADD COLUMN duration interval;

ALTER TABLE podcast_episodes ADD COLUMN duration interval SECOND(0);

ALTER TABLE podcast_episodes ADD COLUMN duration interval SECOND;

我想存储播客剧集的持续时间,然后用 podcast_playback_history 和 first_mark 和 last_mark 来计算整个剧集的收听百分比。

文档说

The interval type has an additional option, which is to restrict the set of stored fields by writing one of these phrases:

月份

小时

分钟

年环比

每天

每天一分钟

第二天

小时到分钟

小时秒

分秒

Note that if both fields and p are specified, the fields must include SECOND, since the precision applies only to the seconds.

如果我把它设置为秒有没有额外的好处?它仍然是 16 字节还是更少? 我尝试使用秒和秒 (0),当我保存该行时它仍然显示为“0 年 0 月 0 天 0 小时 0 分钟 2.00 秒”

添加的 fields 规范决定了如何解释未标记数量的字符串。

The manual:

When writing an interval constant with a fields specification, or when assigning a string to an interval column that was defined with a fields specification, the interpretation of unmarked quantities depends on the fields. For example INTERVAL '1' YEAR is read as 1 year, whereas INTERVAL '1' means 1 second.

从不将这些修饰符用于类型定义。最好坚持默认间隔并避免混淆。始终在字符串文字中拼出数量名称(interval '13 seconds'interval '13 sec'),从不 interval '13' - 添加类型修饰符会起作用的唯一情况。我不想依赖table 解释我的输入的定义。尤其是这种不常用的功能。

可选的精度修饰符 (0) .. (6) 仅适用于秒,并且仅允许与该字段规范一起使用。 The manual:

Note that if both fields and p are specified, the fields must include SECOND, since the precision applies only to the seconds.

它定义了为亚秒存储多少个小数位。如果您使用它(我会 而不是 ),请注意值是 舍入的 ,而不是截断的(就像人们可能期望的那样)。

test=> SELECT '13.555555 sec'::interval(3);
   interval   
--------------
 00:00:13.556    -- !
(1 row)

test=> SELECT '13.555555 sec'::interval(0);
 interval 
----------
 00:00:14        -- !!!
(1 row)

演示:

db<>fiddle here

Is there added benefit if I set it to second?

不,这是默认设置。 (我强烈建议坚持使用默认值以避免混淆。)

Will it still be 16 bytes or will it be less?

interval 值的大小总是 16 个字节。