2

这些命令有什么区别?

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 计算收听的整个剧集的百分比。

文档说

间隔类型有一个附加选项,即通过编写以下短语之一来限制存储字段集:

小时

分钟

第二

一年到一个月

日复一日

日复一日

第二天

小时到分钟

小时到秒

分到秒

请注意,如果同时指定了字段和 p,则字段必须包含 SECOND,因为精度仅适用于秒。

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

4

1 回答 1

1

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

手册:

在使用字段规范编写区间常量时,或将字符串分配给使用字段规范定义的区间列时,未标记数量的解释取决于字段。例如INTERVAL '1' YEAR读作 1 年,而INTERVAL '1'表示 1 秒。

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

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

请注意,如果同时指定fieldsp,则字段必须包含SECOND,因为精度仅适用于秒。

它定义了在亚秒内存储多少十进制数字。如果您使用它(我不会),请注意值是四舍五入的,而不是截断的(就像人们可能期望的那样)。

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<>在这里摆弄

如果我将其设置为 会有额外的好处second吗?

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

它仍然是 16 个字节还是会更少?

interval值的大小始终为16 字节。

于 2021-04-18T03:53:21.357 回答