19.Evaluate the following query:
SELECT INTERVAL '300' MONTH,
INTERVAL '54-2' YEAR TO MONTH,
INTERVAL '11:12:10.1234567' HOUR TO SECOND
FROM dual;
What is the correct output of the above query?
A:+25-00 , +54-02, +00 11:12:10.123457
B:+00-300, +54-02, +00 11:12:10.123457
C:+25-00 , +00-650, +00 11:12:10.123457
D:+00-300 , +00-650, +00 11:12:10.123457
答案:A
A:正确
B:错误,这里300有问题
C:错误,这里650有问题
D:错误,这里300有问题
解析:考察的是interval类型,具体说明如下
一、interval类型有2种类型
1.interval year to month
interval year[(years_precision)] to month --参数为年的精度
---示例----
interval '1' year 间隔为1年
interval '11' month 间隔为11个月
interval '1-3' year to month 间隔为1年3个月
interval '0-5' year to month 间隔为5个月
interval '123' year(3) to month 间隔为123年
interval '-1-5' year to month 间隔为负的1年5个月
interval '1234' year(3) 无效,因为year指定精度为3
允许我们使用年和月定义时间间隔
2.interval day to second
interval day[(days_precision)] to second[(seconds_precision)] --参数为精度
允许我们用天、小时、分钟、秒(包括小数的秒)定义时间间隔
---示例----
interval '3' day 间隔为3天
interval '2' hour 间隔为2小时
interval '25' minute 间隔为25分钟
interval '45' second 间隔为45秒
interval '3 2' day to hour 间隔为3天2小时
interval '3 2:25' day to minute 间隔为3天2小时25分钟
interval '3 2:25:45' day to second 间隔为3天2小时25分钟45秒
interval '123 2:25:45.12' day(3) to second(2) 间隔为123天2小时25分钟45.12秒
interval '3 2:00:45' day to second 间隔为3天2小时0分钟45秒
interval '-3 2:25:45' day to second 间隔为负3天2小时25分钟45秒
interval '1234 2:25:45' day(3) to second 间隔无效day精度为3
interval '123 2:25:45.123' day to second(2) 间隔无效second精度为2
二、何时使用
declare
start_date timestamp;
end_date timestamp;
service_interval interval year to month;
years_of_service number;
months_of_service number;
begin
start_date := to_timestamp('29-01-1988','dd-mm-yyyy');
end_date := to_timestamp('26-01-1995','dd-mm-yyyy');
--确定工龄,并显示出来
service_interval := (end_date-start_date) year to month;
dbms_output.put_line(service_interval);
--用新的extract函数分别提取年和月
years_of_service := extract(year from service_interval);
months_of_service := extract(month from service_interval);
dbms_output.put_line(years_of_service || ' years and '|| months_of_service || ' months');
end;
输出:+07-00
7 years and 0 months
三、时间间隔相减
两个interval相减得到的是一个interval day to second
两个timestamp相减得到一个interval day to second
两个date相减得到一个数字
四、时间间隔的转换
1.从数字到时间间隔的转换
numtoyminterval --num to interval year to month
declare
y2m interval year to month;
begin
y2m := numtoyminterval(10.5,'Year');
dbms_output.put_line(y2m);
y2m := numtoyminterval(1199,'Month');
dbms_output.put_line(y2m);
y2m := numtoyminterval(10.4,'Month');
dbms_output.put_line(y2m);
end;
输出:+10-06,+99-11,+00-10
说明:month没有小数,如果出现小数那么四舍五入
numtodsinterval --num to interval day to second
declare
d2s interval day to second;
begin
d2s := numtodsinterval(1440,'minute');
dbms_output.put_line(d2s);
d2s := numtodsinterval(99,'day');
dbms_output.put_line(d2s);
d2s := numtodsinterval(2399,'hour');
dbms_output.put_line(d2s);
d2s := numtodsinterval(143999,'minute');
dbms_output.put_line(d2s);
d2s := numtodsinterval(8639999.999999,'second');
dbms_output.put_line(d2s);
end;
输出:+01 00:00:00.000000,
说明:year最大99,month最大1199也就是99年11个月
day最大99,hour最大2400-1,也就是99天23小时,minute精度2400*60-1,
second最大值2400*60*60-0.000001 (默认没有设置精度的情况下)
2.从字符转换为时间间隔
to_yminterval --格式为 to_yminterval('y-m');
to_dsinterval --格式为 to_dsinterval('D HH:MI:SS.FF');