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
规范决定了如何解释未标记数量的字符串。
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 个字节。
这些命令有什么区别?
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
规范决定了如何解释未标记数量的字符串。
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, whereasINTERVAL '1'
means 1 second.
我从不将这些修饰符用于类型定义。最好坚持默认间隔并避免混淆。始终在字符串文字中拼出数量名称(interval '13 seconds'
或 interval '13 sec'
),从不 interval '13'
- 添加类型修饰符会起作用的唯一情况。我不想依赖table 解释我的输入的定义。尤其是这种不常用的功能。
可选的精度修饰符 (0)
.. (6)
仅适用于秒,并且仅允许与该字段规范一起使用。 The manual:
Note that if both
fields
andp
are specified, the fields must includeSECOND
, 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 个字节。