Oracle PL/SQL Tutorial/PL SQL Data Types/INTERVAL

Материал из SQL эксперт
Перейти к: навигация, поиск

Add 1 year, 2 months, 3 days, 4 hours, 5 minutes, 6.7 seconds

   <source lang="sql">

SQL> SQL> DECLARE

 2     hire_date TIMESTAMP WITH TIME ZONE;
 3
 4     a INTERVAL YEAR TO MONTH;
 5     b INTERVAL DAY TO SECOND;
 6  BEGIN
 7     hire_date := TIMESTAMP "2000-09-01 00:00:00 -5:00";
 8     DBMS_OUTPUT.PUT_LINE(hire_date);
 9
10     a := INTERVAL "1-2" YEAR TO MONTH;
11     b := INTERVAL "3 4:5:6.7" DAY TO SECOND;
12
13
14     hire_date := hire_date + a + b + 36/24;
15     DBMS_OUTPUT.PUT_LINE(hire_date);
16
17
18  END;
19  /

PL/SQL procedure successfully completed. SQL> SQL> SQL> SQL></source>


Add date interval to timestamp

   <source lang="sql">

SQL> SQL> DECLARE

 2     v_college_deadline TIMESTAMP;
 3  BEGIN
 4     v_college_deadline := TO_TIMESTAMP("06/06/2004", "DD/MM/YYYY")
 5                           + INTERVAL "12-3" YEAR TO MONTH
 6                           + INTERVAL "19 9:0:0.0" DAY TO SECOND;
 7
 8     DBMS_OUTPUT.PUT_LINE("My daughter leaves for college in "
 9                          ||v_college_deadline);
10  END;
11  /

My daughter leaves for college in 25-SEP-16 09.00.00.000000 AM PL/SQL procedure successfully completed. SQL> SQL></source>


Adding and subtracting intervals

   <source lang="sql">

SQL> DECLARE

 2     a1 INTERVAL DAY TO SECOND := "2 3:4:5.6";
 3     b1 INTERVAL DAY TO SECOND := "1 1:1:1.1";
 4
 5     a2 INTERVAL YEAR TO MONTH := "2-10";
 6     b2 INTERVAL YEAR TO MONTH := "1-1";
 7
 8     a3 NUMBER := 3;
 9     b3 NUMBER := 1;
10  BEGIN
11     DBMS_OUTPUT.PUT_LINE(a1 - b1);
12     DBMS_OUTPUT.PUT_LINE(a2 - b2);
13     DBMS_OUTPUT.PUT_LINE(a3 - b3);
14  END;
15  /

PL/SQL procedure successfully completed. SQL> SQL></source>


Add some days, hours, minutes, and seconds

   <source lang="sql">

SQL> DECLARE

 2     hire_date TIMESTAMP WITH TIME ZONE;
 3
 4     a INTERVAL YEAR TO MONTH;
 5     b INTERVAL DAY TO SECOND;
 6  BEGIN
 7     hire_date := TIMESTAMP "2000-09-01 00:00:00 -5:00";
 8     DBMS_OUTPUT.PUT_LINE(hire_date);
 9
10     a := INTERVAL "1-2" YEAR TO MONTH;
11     b := INTERVAL "3 4:5:6.7" DAY TO SECOND;
12
13     hire_date := hire_date + b;
14     DBMS_OUTPUT.PUT_LINE(hire_date);
15  END;
16  /

PL/SQL procedure successfully completed. SQL></source>


Add some years and months

   <source lang="sql">

SQL> SQL> DECLARE

 2     hire_date TIMESTAMP WITH TIME ZONE;
 3
 4     a INTERVAL YEAR TO MONTH;
 5     b INTERVAL DAY TO SECOND;
 6  BEGIN
 7     hire_date := TIMESTAMP "2000-09-01 00:00:00 -5:00";
 8     DBMS_OUTPUT.PUT_LINE(hire_date);
 9
10     a := INTERVAL "1-2" YEAR TO MONTH;
11     b := INTERVAL "3 4:5:6.7" DAY TO SECOND;
12
13     hire_date := hire_date + a;
14     DBMS_OUTPUT.PUT_LINE(hire_date);
15
16  END;
17  /

PL/SQL procedure successfully completed.</source>


DAY TO SECOND examples

   <source lang="sql">

SQL> SQL> DECLARE

 2     A INTERVAL YEAR TO MONTH;
 3     B INTERVAL YEAR TO MONTH;
 4     C INTERVAL DAY TO SECOND;
 5     D INTERVAL DAY TO SECOND;
 6  BEGIN
 7     C := INTERVAL "10 1:02:10.123" DAY TO SECOND;
 8
 9  END;
10  /

PL/SQL procedure successfully completed. SQL></source>


Double the interval

   <source lang="sql">

SQL> SQL> DECLARE

 2     B INTERVAL DAY(9) TO SECOND(9);
 3
 4     FUNCTION double_my_interval (A IN INTERVAL DAY TO SECOND) RETURN INTERVAL DAY TO SECOND
 5     IS
 6     BEGIN
 7        RETURN A * 2;
 8     END;
 9  BEGIN
10     B := "1 0:0:0.123456789";
11     DBMS_OUTPUT.PUT_LINE(B);
12     DBMS_OUTPUT.PUT_LINE(double_my_interval(B));
13  END;
14  /

PL/SQL procedure successfully completed. SQL></source>


INTERVAL includes two datatypes that allow you to set appropriate durations more precisely

   <source lang="sql">

declare

   variable1_int INTERVAL YEAR[(precision)] TO MONTH;

begin

   NULL;

end;</source>


Interval multiplication

   <source lang="sql">

SQL> SQL> DECLARE

 2     a1 INTERVAL DAY TO SECOND := "2 3:4:5.6";
 3     a2 INTERVAL YEAR TO MONTH := "2-10";
 4     a3 NUMBER := 3;
 5  BEGIN
 6
 7     DBMS_OUTPUT.PUT_LINE(a1 * 2);
 8     DBMS_OUTPUT.PUT_LINE(a2 * 2);
 9     DBMS_OUTPUT.PUT_LINE(a3 * 2);
10
11  END;
12  /

PL/SQL procedure successfully completed. SQL> SQL></source>


Interval value expressions

   <source lang="sql">

SQL> SQL> DECLARE

 2     A INTERVAL YEAR TO MONTH;
 3     B INTERVAL YEAR TO MONTH;
 4     C INTERVAL DAY TO SECOND;
 5     D INTERVAL DAY TO SECOND;
 6  BEGIN
 7     A := INTERVAL "40-3" YEAR TO MONTH;
 8     B := INTERVAL "40" YEAR;
 9
10  END;
11  /

PL/SQL procedure successfully completed. SQL></source>


length of service for INTERVAL YEAR TO MONTH

   <source lang="sql">

SQL> SQL> DECLARE

 2     start_date DATE;
 3     end_date DATE;
 4     service_interval INTERVAL YEAR TO MONTH;
 5     years_of_service NUMBER;
 6     months_of_service NUMBER;
 7  BEGIN
 8     start_date := TO_DATE("29-DEC-1988","dd-mon-yyyy");
 9     end_date := TO_DATE ("26-DEC-1995","dd-mon-yyyy");
10
11  END;
12  /

PL/SQL procedure successfully completed. SQL></source>


Show some interval division

   <source lang="sql">

SQL> SQL> DECLARE

 2     a1 INTERVAL DAY TO SECOND := "2 3:4:5.6";
 3     a2 INTERVAL YEAR TO MONTH := "2-10";
 4     a3 NUMBER := 3;
 5  BEGIN
 6
 7     DBMS_OUTPUT.PUT_LINE(a1 / 2);
 8     DBMS_OUTPUT.PUT_LINE(a2 / 2);
 9     DBMS_OUTPUT.PUT_LINE(a3 / 2);
10  END;
11  /

PL/SQL procedure successfully completed. SQL></source>


Storing elapsed time with INTERVAL DAY TO SECOND

   <source lang="sql">

SQL> SQL> declare

 2      v_start_ts  TIMESTAMP:= to_timestamp("14:00:00","HH24:MI:SS");
 3      v_end_ts    TIMESTAMP:= to_timestamp("15:12:24","HH24:MI:SS");
 4      v_delta_int INTERVAL DAY TO SECOND;
 5  begin
 6     v_delta_int:=v_end_ts-v_start_ts;
 7     DBMS_OUTPUT.put_line(v_delta_int);
 8  end;
 9  /

+00 01:12:24.000000 PL/SQL procedure successfully completed. SQL></source>


Use INTERVAL types

   <source lang="sql">

SQL> SQL> SET SERVEROUTPUT ON SQL> SQL> DECLARE

 2     v_college_deadline TIMESTAMP;
 3  BEGIN
 4     v_college_deadline := TO_TIMESTAMP("06/06/2004", "DD/MM/YYYY")
 5                           + INTERVAL "12-3" YEAR TO MONTH;
 6
 7     DBMS_OUTPUT.PUT_LINE("My daughter leaves for college in "
 8                          ||v_college_deadline);
 9  END;
10  /

My daughter leaves for college in 06-SEP-16 12.00.00.000000 AM PL/SQL procedure successfully completed. SQL> SQL></source>


workarounds for defining intervals

   <source lang="sql">

SQL> SQL> DECLARE

 2     A INTERVAL YEAR TO MONTH;
 3     B INTERVAL YEAR TO MONTH;
 4     C INTERVAL DAY TO SECOND;
 5     D INTERVAL DAY TO SECOND;
 6  BEGIN
 7     SELECT INTERVAL "1:02" HOUR TO MINUTE
 8     INTO D
 9     FROM dual;
10
11     D := INTERVAL "1" HOUR + INTERVAL "02" MINUTE;
12
13  END;
14  /

PL/SQL procedure successfully completed. SQL></source>