时间间隔类型¶
神通数据库的时间间隔类型分两种:一种为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 |