时间间隔类型

神通数据库的时间间隔类型分两种:一种为INTERVAL YEAR[(p)] TO MONTH,用来保存年份和月份;一种为INTERVAL DAY[(p)] TO SENOND[(q)],用来保存天数、小时、分钟和秒。

INTERVAL YEAR[(p)] TO MONTH类型

表221神通数据库支持的INTERVAL YEAR[(p)] TO MONTH类型

类型 描述 存储 最小 最大 精确度
INTERVAL YEAR[(p)] TO MONTH 表示年份和月份的时间间隔类型 8 字节 -999999999-11 999999999-11 1 月

INTERVAL YEAR[(p)] TO MONTH中的p是指年域的最大位数,范围是[0,9],如果不输入,默认为2。

  • 输入格式

INTERVAL YEAR[(p)] TO MONTH类型的输入有两种方式,一种是完全输入,一种是部分输入。

完全输入即输入时按照YEAR- MONTH格式输入,如下表所示:

表222神通数据库INTERVAL YEAR[(p)]TO MONTH类型完全输入格式

类型域 格式串
[+/-]year[(p)] to month

12-10,表示12 year 10 month.

-12-10,表示-12 year -10 month.

-0-1,表示-1 month.

12-0,表示12 year.

部分输入即输入时只输入YEAR域或MONTH域,如下表所示:

表223神通数据库INTERVAL YEAR[(p)] TO MONTH类型部分输入格式

类型域 子域 格式串
[+/-]year[(p)] to month year

interval'123' year[(p)].

interval'-15' year[(p)].

  month

interval'301' month[(p)].

interval'-123' month[(p)].

注解

如果以完全格式输入,可以指定域(此时一定是year[(p)] to month),也可以不指定。但如果是以部分格式输入,则必须指定具体的子域。

符号+/-要么缺失(缺省默认为+),要么出现且只能出现一次,而且必须在数据串的串头,用来控制所有域的符号。

只有开头域可指定精度。非开头域不能指定精度,且输入的值不能达到或超过向之前域进位的大小,比如当以interval '1-2' year(p) to month的格式输入时,month是非开头的域,所以其大小只能是[0,11]。但当以interval '2' month(p)的格式输入时,month是开头域,这时其范围就不再局限于[0,11],但要符合精度p的限制。

无论以哪种格式输入,指定的精度p都是用来限制year域的,比如interval '1-2' year(3) to month和interval '1' year(3),就限定了year 的范围是[-999,999],因此两种输入格式的最大值分别是interval '999-11' year(3) to month和interval '999' year(3)。即使是以interval '2' month(3)这种格式输入,指定的精度3也是用来限制year的范围的,而不是month本身,因此此时允许输入的最大值是interval '11999' month(3),而不是interval '999' month(3)。

任何域都不允许超出 999999999。比如interval '1000000000' month(9),虽然圆整到year时只有83333333年,并没有超出指定的year的范围(999999999),但由于month本身超出了允许输入的最大值(999999999),所以仍然会报错。

以上说明了输入的interval year to month值要符合指定的子域以及精度要求,但在完全符合输入串中指定的子域以及精度的情况下,如果超出了建表时指定的精度,也会报错。比如:create table t1(c1 interval year to month); insert into t1 values(interval '999' year(3)); 虽然insert语句中的数值与指定的子域完全匹配,精度也符合要求,但由于建表时指定的year的精度是默认值2,最大只允许到99,因此会报错。

  • 输出格式

输出格式如下表:

表224神通数据库INTERVAL YEAR[(p)] TO MONTH类型输出格式

类型域 输入格式 输出格式
[+/-]year[(p)] to month interval'123' year[(p)]. +123-00
  interval'-15' year[(p)]. -15-00
  interval'301' month[(p)]. +25-01
  interval'-123' month[(p)]. -10-03
  interval '11-10' year[(p)] to month +11-10
  interval '-6-1' year[(p)] to month -6-01
  '11-10' +11-10
  '-6-1' -6-01

INTERVAL DAY[(p)] TO SECOND[(q)]类型

表225神通数据库支持的INTERVAL DAY[(p)] TO SECOND[(q)]类型

类型 描述 存储 最小 最大 精确度
INTERVAL DAY[(p)] TO SECOND[(q)] 表示天数、小时、分钟和秒的时间间隔类型 8 字节 -999999 23:59:59.999999 999999 23:59:59.999999 1微秒

INTERVAL DAY[(p)] TO SECOND[(q)]中的精度p表示day的最大位数,范围是[0,6],如果不指定,默认为2。精度q表示秒域小数点之后可以保留的最大位数。取值范围是[0,6],即最大可精确到微秒。如果不指定q的值,则默认为用户输入的精度,但最大不超过6。当q被指定为1到5时,如果输入的小数位数超过q位,则根据q+1位的值四舍五入至q位,当q被指定为6或者不被指定时,如果输入的小数位数超出6位,则超出部分直接截断。

  • 输入格式

INTERVAL DAY[(p)] TO SECOND[(q)]类型的输入有两种方式,一种是完全输入,一种是部分输入。

完全输入即按照DAY HOUR:MINUTE:SECOND格式输入,如下表所示:

表226神通数据库INTERVAL DAY[(p)] TO SECOND[(q)]类型完全输入格式

类型域 格式串
[+/-]day[(p)] to second[(q)]

1 10:11:12,即1day 10 hour 11 minute 12 second.

-10 23:59:59,即-10 day -23 hour -59 minute -59 second.

部分输入只输入INTERVAL DAY[(p)] TO SECOND[(q)]的子域,允许出现的子域为DAY、HOUR、MINUTE、SECOND、DAY TO HOUR、DAY TO MINUTE、HOUR TO MINUTE、HOUR TO SECOND和MINUTE TO SECOND,如下表所示:

表227神通数据库INTERVAL DAY[(p)] TO SECOND[(q)]类型部分格式

类型域 子域 格式串
[+/-]day[(p)] to second[(q)] day interval'200'day[(p)]. interval'-300' day[(p)].
  hour interval '100' hour[(p)]. interval'-200' hour[(p)].
  minute interval'10' minute[(p)]. interval'-100' minute[(p)].
  second interval'30.567' second[(p[,q])]. interval'-81.2' second[(p[,q])].
  day to hour interval'400 5' day[(p)] to hour. interval'-200 10' day[(p)] to hour.
  day to minute interval '20 12:13' day[(p)] to minute. interval '-100 6:17' day[(p)] to minute.
  hour to minute interval '11:20' hour[(p)] to minute. interval '-18:16' hour[(p)] to minute.
  hour to second interval '11:12:13.12' hour[(p)] to second[(q)]. interval '-11:12:13' hour[(p)] to second[(q)].
  minute to second interval '10:12' minute[(p)] to second[(q)]. interval '-59:59' minute[(p)] to second[(q)].

注解

如果以完全格式输入,可以指定域(此时一定是day[(p)] to second[(q)]),也可以不指定。但如果是以部分格式输入,则必须指定具体的子域。

符号+/-要么缺失(缺省默认为+),要么出现且只能出现一次,而且必须在数据串的串头,用来控制所有域的符号。

只有开头域可指定精度p。非开头域不能指定精度p,且输入的值不能达到或超过向之前域进位的大小。当作为非开头域时,hour的范围是[0,23],minute的范围是[0,59],second的范围是[0,59.999999]。但当这些域作为开头域时,不受以上约束,但要符合精度p的限制。

无论以哪种格式输入,指定的精度p都是用来限制day域的。因此当day以外的其它域作为开头域时,即使该域输入的值超出p所限定的最大位数,只要圆整之后的day域不超过也是正确的。比如,interval '23999'hour(3),虽然23999超出了3位,但圆整之后的day是999,没有超出3位,因此是正确的。但如果输入interval '24000' hour(3),就会报错,因为此时圆整到day是1000,超出了3位。

只有second域可以指定q,即小数位数。当second域作为开头域时,如果不指定任何精度信息,如interval '3.456' second,则p(整数位数)按默认值2计、q(小数位数)默认为用户输入的精度,但最大不超过6。如果指定一个精度信息,如interval '3.456' second(3),表示p为3,q按默认值计。如果指定两个精度信息,则前一个表示p,后一个表示q,如interval '3.456' second(3,5),表示p为3,q为5。无法单独指定q。当second域作为非开头域时,不允许指定p,因此如果在其后指定精度,如interval '3:4.567' minute to second(3),则这里的3一定表示q。如不指定,q按默认值计。

任何域都不允许超出 999999。比如interval '1000000' hour(6),虽然圆整到day时只有41666天,并没有超出指定的day的范围(999999),但由于hour本身超出了允许输入的最大值(999999),所以仍然会报错。

以上说明了输入的interval day to second值要符合指定的子域以及精度要求,但在完全符合输入串中指定的子域以及精度的情况下,如果超出了建表时指定的精度,也会报错。比如:create table t1(c1 interval day to second); insert into t1 values(interval '999' day(3)); 虽然insert语句中的数值与指定的子域完全匹配,精度也符合要求,但由于建表时指定的day的精度是默认值2,最大只允许到99,因此会报错。

  • 输出格式

输出格式如下表:

表228神通数据库INTERVAL DAY[(p)] TO SECOND[(q)]类型输出格式

类型域 输入格式 输出格式
[+/-]day[(p)] to second[(q)] interval'200'day[(p)]. +200 00:00:00
  interval'-300' day[(p)]. -300 00:00:00
  interval '100' hour[(p)]. +4 04:00:00
  interval'-200' hour[(p)]. -8 08:00:00
  interval'10' minute[(p)]. +0 00:10:00
  interval'-100' minute[(p)]. -0 01:40:00
  interval'30.567' second[(p[,q])]. +0 00:00:30.567
  interval'-81.27' second[(p[,q])]. -0 00:01:21.3
  interval'400 5' day[(p)] to hour. +400 05:00:00
  interval'-200 10' day[(p)] to hour. -200 10:00:00
  interval '20 12:13' day[(p)] to minute. +20 12:13:00
  interval '-100 6:17' day[(p)] to minute. -100 06:17:00
  interval '6 5:12:10.222' day[(p)] to second[(q)]. +6 05:12:10.222
  interval '-8 6:18:16' day[(p)] to second[(q)]. -8 06:18:16
  interval '11:20' hour[(p)] to minute. +0 11:20:00
  interval '-18:16' hour[(p)] to minute. -0 18:16:00
  interval '11:12:13.12' hour[(p)] to second[(q)]. +0 11:12:13.12
  interval '-11:12:13' hour[(p)] to second[(q)]. -0 11:12:13
  interval '10:12' minute[(p)] to second[(q)]. +0 00:10:12
  interval '-59:59' minute[(p)] to second[(q)]. -0 00:59:59