Oracle PL/SQL/Data Type/TIMESTAMP

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

A normalization to DB timezone

   <source lang="sql">
   

SQL> SQL> DECLARE

 2
 3      v1  DATE;
 4      v2  TIMESTAMP;                 
 5      v3  TIMESTAMP WITH TIME ZONE;  
 6      v4  TIMESTAMP WITH LOCAL TIME ZONE;  
 7
 8  BEGIN
 9
10  
11      v4 := TIMESTAMP "2002-11-03 03:00:00 -07:00";
12      dbms_output.put_line(v4);
13
14  END;
15  /

03-NOV-02 02.00.00.000000 AM PL/SQL procedure successfully completed. SQL> SQL>



 </source>
   
  


Assign current_timestamp to timestamp type variable

   <source lang="sql">
   

SQL> SQL> declare

 2    t1   timestamp := current_timestamp + 1 ;
 3    i1  INTERVAL DAY TO SECOND;
 4  begin
 5    i1 := t1 - current_timestamp;
 6    dbms_output.put_line(i1);
 7  end;
 8  /

+00 23:59:59.789000 PL/SQL procedure successfully completed. SQL> SQL>



 </source>
   
  


Create a table with two columns, Use Datatypes: TIMESTAMP WITH TIME ZONE and TIMESTAMP WITH LOCAL TIME ZONE

   <source lang="sql">
   

SQL> SQL> SQL> SQL> create table t(

 2      c1 timestamp with time zone,
 3      c2 timestamp with local time zone
 4  )
 5  /

Table created. SQL> SQL> drop table t; Table dropped. SQL>



 </source>
   
  


Define and set timestamp value

   <source lang="sql">
   

SQL> SET SERVEROUTPUT ON SQL> SQL> DECLARE

 2     myDateTime TIMESTAMP := TIMESTAMP "2004-06-05 22:14:01";
 3  BEGIN
 4     DBMS_OUTPUT.PUT_LINE(myDateTime);
 5  END;
 6  /

05-JUN-04 10.14.01.000000 PM PL/SQL procedure successfully completed. SQL> SQL>



 </source>
   
  


Define a TIMESTAMP variable with a default null or initialized value

   <source lang="sql">
   

SQL> --var1 TIMESTAMP; -- Implicitly assigns a null value. SQL> --var2 TIMESTAMP := SYSTIMESTAMP; -- Explicitly assigns a value. SQL> --var3 TIMESTAMP(3); -- Explicitly sets precision for null value. SQL> --var4 TIMESTAMP(3) := SYSTIMESTAMP; -- Explicitly sets precision and value. SQL>



 </source>
   
  


Demonstrate the new ANSI Timestamp literal. Use 0-9 digits for fractional seconds

   <source lang="sql">
   

SQL> DECLARE

 2
 3      v1  DATE;
 4      v2  TIMESTAMP;                 -- No time zone kept.
 5      v3  TIMESTAMP WITH TIME ZONE;  -- Preserves time zone entered.
 6      v4  TIMESTAMP WITH LOCAL TIME ZONE;  -- Converts session to DB time zone.
 7
 8  BEGIN
 9
10  
11      v2 := TIMESTAMP "2002-11-03 03:00:00.00";
12      dbms_output.put_line(v2);
13  END;
14  /

03-NOV-02 03.00.00.000000 AM PL/SQL procedure successfully completed. SQL> SQL>



 </source>
   
  


Difference between the DATE and TIMESTAMP datatypes:

   <source lang="sql">
   

SQL> SQL> DECLARE

 2    d DATE := SYSTIMESTAMP;
 3    t TIMESTAMP(3) := SYSTIMESTAMP;
 4  BEGIN
 5    dbms_output.put_line("DATE      ["||d||"]");
 6  END;
 7  /

DATE [26-OCT-09] PL/SQL procedure successfully completed. SQL>



 </source>
   
  


gets the date a little more exact

   <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") + INTERVAL "12-3" YEAR TO MONTH + INTERVAL "19 9:0:0.0" DAY TO SECOND;
 5
 6     DBMS_OUTPUT.PUT_LINE("My daughter leaves for college in " ||v_college_deadline);
 7  END;
 8  /

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



 </source>
   
  


Insert sysdate value to timestamp type column

   <source lang="sql">
   

SQL> SQL> SQL> create table myTable (ts timestamp); Table created. SQL> SQL> insert into myTable values (sysdate); 1 row created. SQL> SQL> select * from myTable;

TS


26-OCT-09 08.31.47.000000 AM 1 row selected. SQL> SQL> drop table myTable ; Table dropped. SQL>



 </source>
   
  


Retrieve the timestamp into a variable

   <source lang="sql">
   

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

 2     myDateTime TIMESTAMP;
 3  BEGIN
 4     SELECT systimestamp INTO myDateTime FROM dual;
 5     DBMS_OUTPUT.PUT_LINE(myDateTime);
 6  EXCEPTION
 7     WHEN OTHERS
 8     THEN
 9        DBMS_OUTPUT.PUT_LINE(sqlerrm);
10  END;
11  /

26-OCT-09 10.40.28.429000 AM PL/SQL procedure successfully completed. SQL> SQL>



 </source>
   
  


system timestamp

   <source lang="sql">
   

SQL> SQL> DECLARE

 2    d DATE := SYSTIMESTAMP;
 3    t TIMESTAMP(3) := SYSTIMESTAMP;
 4  BEGIN
 5    dbms_output.put_line("TO_CHAR   ["||TO_CHAR(d,"DD-MON-YY HH24:MI:SS")||"]");
 6  END;
 7  /

TO_CHAR [26-OCT-09 09:03:59] PL/SQL procedure successfully completed. SQL>



 </source>
   
  


The TIMESTAMP WITH LOCAL TIME ZONE datatype stores the date/time

   <source lang="sql">
   

SQL> SQL> DECLARE

 2     v_datetime TIMESTAMP (0) WITH LOCAL TIME ZONE := SYSTIMESTAMP;
 3  BEGIN
 4     DBMS_OUTPUT.PUT_LINE(v_datetime);
 5  END;
 6  /

26-OCT-09 10.40.53 AM PL/SQL procedure successfully completed. SQL>



 </source>
   
  


The TIMESTAMP WITH TIME ZONE datatype stores the date/time

   <source lang="sql">
   

SQL> SQL> DECLARE

 2     v_datetime TIMESTAMP (3) WITH TIME ZONE := SYSTIMESTAMP;
 3  BEGIN
 4     DBMS_OUTPUT.PUT_LINE(v_datetime);
 5  END;
 6  /

26-OCT-09 10.40.52.639 AM -08:00 PL/SQL procedure successfully completed. SQL>



 </source>
   
  


TIMESTAMP(3)

   <source lang="sql">
   

SQL> SQL> DECLARE

 2    d DATE := SYSTIMESTAMP;
 3    t TIMESTAMP(3) := SYSTIMESTAMP;
 4  BEGIN
 5    dbms_output.put_line("TIMESTAMP ["||t||"]");
 6  END;
 7  /

TIMESTAMP [26-OCT-09 09.03.59.767 AM] PL/SQL procedure successfully completed. SQL>



 </source>
   
  


TIMESTAMP literal

   <source lang="sql">
   

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

 2     myDateTime_ltz TIMESTAMP WITH LOCAL TIME ZONE := TIMESTAMP "2004-06-05 22:14:01";
 3  BEGIN
 4     DBMS_OUTPUT.PUT_LINE(myDateTime_ltz);
 5  END;
 6  /

05-JUN-04 10.14.01.000000 PM PL/SQL procedure successfully completed. SQL> SQL>



 </source>
   
  


TIMESTAMP literal supports Time Zone (as offset from UTC). Default is SESSION Timezone

   <source lang="sql">
   

SQL> SQL> DECLARE

 2
 3      v1  DATE;
 4      v2  TIMESTAMP;                 
 5      v3  TIMESTAMP WITH TIME ZONE;  
 6      v4  TIMESTAMP WITH LOCAL TIME ZONE;  
 7
 8  BEGIN
 9
10  
11      v3 := TIMESTAMP "2002-11-03 03:00:00 -07:00";
12      dbms_output.put_line(v3);
13
14  END;
15  /

03-NOV-02 03.00.00.000000 AM -07:00 PL/SQL procedure successfully completed. SQL>



 </source>
   
  


timestamp procedure member variable

   <source lang="sql">
   

SQL> CREATE OR REPLACE PROCEDURE CompileError AS

 2       myDateTime timestamp;
 3  BEGIN
 4     SELECT systimestamp INTO myDateTime FROM dual;
 5     DBMS_OUTPUT.PUT_LINE(myDateTime);
 6  EXCEPTION
 7     WHEN OTHERS
 8     THEN
 9        DBMS_OUTPUT.PUT_LINE(SQLERRM);
10  END;
11  /

Procedure created. SQL> SQL> exec compileerror 26-OCT-09 10.40.32.605000 AM PL/SQL procedure successfully completed. SQL>



 </source>
   
  


timestamp type column

   <source lang="sql">
   

SQL> SQL> SQL> create table myTable (ts timestamp); Table created. SQL> SQL> insert into myTable values (sysdate); 1 row created. SQL> SQL> select * from myTable;

TS


26-OCT-09 08.31.47.000000 AM 1 row selected. SQL> SQL> drop table myTable ; Table dropped. SQL>



 </source>
   
  


TIMESTAMP Value WITH LOCAL TIME ZONE

   <source lang="sql">
   

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

 2     myDateTime_ltz TIMESTAMP WITH LOCAL TIME ZONE := TIMESTAMP "2004-06-05 22:14:01";
 3  BEGIN
 4     DBMS_OUTPUT.PUT_LINE(myDateTime_ltz);
 5  END;
 6  /

05-JUN-04 10.14.01.000000 PM PL/SQL procedure successfully completed. SQL> SQL>



 </source>
   
  


TIMESTAMP WITH TIME ZONE

   <source lang="sql">
   

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

 2     myDateTime_tz TIMESTAMP WITH TIME ZONE := TIMESTAMP "2004-06-05 22:14:01 +06:00";
 3  BEGIN
 4     DBMS_OUTPUT.PUT_LINE(myDateTime_tz);
 5  END;
 6  /

05-JUN-04 10.14.01.000000 PM +06:00 PL/SQL procedure successfully completed. SQL> SQL>



 </source>
   
  


Two timestamp subtypes demonstrate similar behaviors. Their prototypes are

   <source lang="sql">
   

TIMESTAMP[(precision)] WITH TIME ZONE TIMESTAMP[(precision)] WITH LOCAL TIME ZONE Declare a TIMESTAMP WITH TIME ZONE variable with a default null or initialized value, as shown: var1 TIMESTAMP WITH LOCAL TIME ZONE; var2 TIMESTAMP WITH LOCAL TIME ZONE := SYSTIMESTAMP; var3 TIMESTAMP(3) WITH LOCAL TIME ZONE; var4 TIMESTAMP(3) WITH LOCAL TIME ZONE := SYSTIMESTAMP;



 </source>
   
  


versions between timestamp minvalue and maxvalue

   <source lang="sql">
   

SQL> SQL> create table emp

 2  ( empno      NUMBER(4)    constraint E_PK primary key
 3  , ename      VARCHAR2(8)
 4  , init       VARCHAR2(5)
 5  , job        VARCHAR2(8)
 6  , mgr        NUMBER(4)
 7  , bdate      DATE
 8  , sal        NUMBER(6,2)
 9  , comm       NUMBER(6,2)
10  , deptno     NUMBER(2)    default 10
11  ) ;

Table created. SQL> insert into emp values(1,"Tom","N", "TRAINER", 13,date "1965-12-17", 800 , NULL, 20); 1 row created. SQL> insert into emp values(2,"Jack","JAM", "Tester",6,date "1961-02-20", 1600, 300, 30); 1 row created. SQL> insert into emp values(3,"Wil","TF" , "Tester",6,date "1962-02-22", 1250, 500, 30); 1 row created. SQL> insert into emp values(4,"Jane","JM", "Designer", 9,date "1967-04-02", 2975, NULL, 20); 1 row created. SQL> insert into emp values(5,"Mary","P", "Tester",6,date "1956-09-28", 1250, 1400, 30); 1 row created. SQL> insert into emp values(6,"Black","R", "Designer", 9,date "1963-11-01", 2850, NULL, 30); 1 row created. SQL> insert into emp values(7,"Chris","AB", "Designer", 9,date "1965-06-09", 2450, NULL, 10); 1 row created. SQL> insert into emp values(8,"Smart","SCJ", "TRAINER", 4,date "1959-11-26", 3000, NULL, 20); 1 row created. SQL> insert into emp values(9,"Peter","CC", "Designer",NULL,date "1952-11-17", 5000, NULL, 10); 1 row created. SQL> insert into emp values(10,"Take","JJ", "Tester",6,date "1968-09-28", 1500, 0, 30); 1 row created. SQL> insert into emp values(11,"Ana","AA", "TRAINER", 8,date "1966-12-30", 1100, NULL, 20); 1 row created. SQL> insert into emp values(12,"Jane","R", "Manager", 6,date "1969-12-03", 800 , NULL, 30); 1 row created. SQL> insert into emp values(13,"Fake","MG", "TRAINER", 4,date "1959-02-13", 3000, NULL, 20); 1 row created. SQL> insert into emp values(14,"Mike","TJA","Manager", 7,date "1962-01-23", 1300, NULL, 10); 1 row created. SQL> SQL> col versions_starttime format a25 SQL> col versions_endtime format a25 SQL> break on empno SQL> SQL> select empno, sal

 2  ,      versions_starttime
 3  ,      versions_endtime
 4  from   emp
 5         versions between timestamp minvalue and maxvalue
 6  where  deptno = 10
 7  order  by empno, versions_starttime nulls first;

no rows selected SQL> SQL> SQL> drop table emp; Table dropped.



 </source>