19.Evaluate the following query:

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');



你可能感兴趣的:(1z0-051)