间隔输入
interval 值可以使用下列语法书写:
[@] quantity unit [quantity unit...] [direction]
其中 quantity 是一个数字(很可能是有符号的); unit 是毫秒、 millisecond、second、 minute、hour、day、 week、month、year、 decade、century、millennium 或者缩写或者这些单位的复数; direction 可以是 ago 或者为空。At 符号(@)是一个可选的噪声。不同单位的数量通过合适的符号计数被隐式地添加。ago 对所有域求反。如果 IntervalStyle 被设置为 postgres_verbose,该语法也被用于间隔输出。
日、小时、分钟和秒的数量可以不适用显式的单位标记指定。例如,'1 12:59:10' 被读作 '1 day 12 hours 59 min 10 sec'。同样,一个年和月的组合可以使用一个横线指定,例如 '200-10' 被读作 '200 年 10 个月'(这些较短的形式事实上是 SQL 标准唯一许可的形式,并且在 IntervalStyle 被设置为 sql_standard 时用于输出)。
间隔值也可以被写成 ISO 8601 时间间隔。带标志符的格式看起来像这样:
P quantity unit [ quantity unit ...] [ T [ quantity unit ...]]
该串必须以一个 P 开始,并且可以包括一个引入当日时间单位的 T。单位可以被忽略,并且可以以任何顺序指定,但是小于一天的单位必须出现在 T 之后。特别地,M 的含义取决于它出现在 T 之前还是之后。
ISO 8601 间隔单位缩写
| 缩写 | 含义 |
|---|---|
| Y | 年 |
| M | 月(在日期部分中) |
| W | 周 |
| D | 日 |
| H | 小时 |
| M | 分钟(在时间部分中) |
| S | 秒 |
如果使用替代格式:
P [ years-months-days ] [ T hours:minutes:seconds ]
串必须以 P 开始,并且一个 T 分隔间隔的日期和时间部分。其值按照类似于 ISO 8601日期的数字给出。
在用一个*域声明书写一个间隔常量时,或者为一个用域声明定义的间隔列赋予一个串时,对于为标记的量的解释依赖于域。例如 INTERVAL '1' YEAR 被解读成 1 年,而INTERVAL '1'表示 1 秒。同样,域*声明允许的最后一个有效域“右边”的域值会被无声地丢弃掉。例如书写 INTERVAL '1 day 2:03:04' HOUR TO MINUTE 将会导致丢弃秒域,而不是日域。
根据 SQL 标准,一个间隔值的所有域都必须由相同的符号,这样一个领头的负号将会应用到所有域;例如在间隔文字 '-1 2:03:04' 中的负号会被应用于日、小时、分钟和秒部分。AntDB 允许域具有不同的符号,并且在习惯上认为以文本表示的每个域具有独立的符号,因此在这个例子中小时、分钟和秒部分被认为是正值。如果 IntervalStyle 被设置为 sql_standard,则一个领头的符号将被认为是应用于所有域(但是仅当没有额外符号出现)。否则将使用传统的 AntDB 解释。为了避免混淆,推荐在任何域为负值时为每一个域都附加一个显式的符号。
在冗长的输入格式中,以及在更紧凑输入格式的某些域中,域值可以有分数部分;例如 '1.5 week' 或 '01:02:03.45'。这样的输入被转换为合适的月数、日数和秒数用于存储。当这样会导致月和日中的分数时,分数被加到低序域中,使用的转换因子是 1 月=30 日和 1 日=24 小时。例如,'1.5 month' 会变成 1 月和 15 日。只有秒总是在输出时被显示为分数。
下表展示了一些有效 interval 输入的例子。




