X

Oracle Application Express
Tipps, Tricks und Best Practice

  • November 24, 2017

DATE, TIMESTAMP und Formatmasken

Carsten Czarski
Consulting Member of technical Staff

Mit DATE oder TIMESTAMP Datentypen wird ständig gearbeitet; sie kommen in jedem Datenmodell vor und folglich muss jede APEX-Anwendung damit umgehen können. Dieser Tipp enthält einige Informationen zum Umgang mit diesen Datentypen - und worauf man als APEX-Entwickler achten sollte.

DATE oder TIMESTAMP?

Die Oracle-Datenbank bietet vier Datentypen zum Speichern von Zeitstempeln an:

  • DATE ist der älteste Datentyp zum Speichern von Zeitstempeln in der Datenbank. Anders als der Name nahelegt, speichert DATE immer sowohl das Datum als auch die Uhrzeit ab. Intern werden ganz konkrete Werte für Jahr, Monat, Tag, Stunde, Minute und Sekunde abgelegt. Die SQL-Funktion SYSDATE gibt den aktuellen Zeitstempel zurück.
    SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
    
    Session geändert.
    
    SQL> select sysdate, dump(sysdate) as date_bytes from dual;
    
    SYSDATE              DATE_BYTES                           
    -------------------- -----------------------------------
    2017-11-23 23:41:08  Typ=13 Len=8: 225,7,11,23,23,41,8,0  
    
  • TIMESTAMP erweitert den DATE-Datentypen um Sekundenbruchteile. Das interne Speicherformat für den TIMESTAMP sieht auch die Zeitzone vor, um diese aktiv nutzen zu können, braucht es jedoch die nachfolgend erläuterten Datentypen TIMESTAMP WITH TIME ZONE und TIMESTAMP WITH LOCAL TIME ZONE. Wie man am folgenden Beispiel sehen kann, liefert LOCALTIMESTAMP den aktuellen Zeitstempel als TIMESTAMP-Datentyp zurück.
    SQL> alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS.FF6';
    
    Session geändert.
    
    SQL> select localtimestamp, dump(localtimestamp) ts_bytes from dual;
    
    LOCALTIMESTAMP              TS_BYTES                                                               
    --------------------------- ---------------------------------------------------------------------
    2017-11-24 08:45:41.434175  Typ=187 Len=20: 225,7,11,24,8,45,41,0,24,252,224,25,1,0,3,0,127,1,0,0
    
  • TIMESTAMP WITH TIME ZONE unterstützt die Zeitzone, und zwar explizit. Die Zeitzonen-Information wird beim Erzeugen einer Instanz explizit übergeben und in der Ausgabe sollte sie stets enthalten sein (richtige Formatmaske verwenden). Gibt man einen TIMESTAMP WITH TIME ZONE ohne Zeitzonen-Information aus, so ist die Information unvollständig.
    Es finden keine implizite Umrechnungen zwischen Zeitzonen statt; dem Entwickler stehen SQL-Funktionen dafür zur Verfügung. Instanz. Um den aktuellen Zeitstempel zu bekommen, verwendet man die SQL-Funktionen SYSTIMESTAMP oderCURRENT_TIMESTAMP. Ersterer liefert die Systemzeit in der Datenbank-Zeitzone, letzterer in der Session Zeitzone zurück. Im folgenden ein Beispiel für SYSTIMESTAMP.
    SQL> alter session set nls_timestamp_tz_format='YYYY-MM-DD HH24:MI:SS.FF6 TZR';
    
    Session geändert.
    
    SQL> select systimestamp from dual;
    
    SYSTIMESTAMP
    ----------------------------------
    2017-11-23 23:57:04.609608 -08:00
    
  • TIMESTAMP WITH LOCAL TIME ZONE unterstützt die Zeitzone implizit. Eine Instanz wird ohne Angabe einer Zeitzone erzeugt; es wird die Session-Zeitzone angenommen; die Ausgabe erfolgt ebenfalls in der Session Zeitzone. Oracle-Intern werden die Instanzen auf die Datenbank-Zeitzone normalisiert. 
    Das folgende Beispiel zeigt, wie TIMESTAMP WITH LOCAL TIME ZONE funktioniert. Zuerst wird eine Tabelle erzeugt und darin der aktuelle Zeitstempel gespeichert. SYSTIMESTAMP liefert zwar einen TIMESTAMP WITH TIME ZONE zurück, dieser wird aber automatisch auf TIMESTAMP WITH LOCAL TIME ZONE konviertiert. Wird die Tabelle danach selektiert, so wird stets auf die aktuelle Session-Zeitzone umgerechnet.
    SQL> create table zeitstempel( ts timestamp with local time zone );
    
    Table created.
    
    SQL> insert into zeitstempel values ( systimestamp );
    
    1 row created.
    
    SQL> alter session set time_zone='Europe/Berlin';
    
    Session altered.
    
    SQL> select * from zeitstempel;
    
    TS
    ---------------------------------------------------------------------------
    2017-11-24 12:55:39.761283
    
    SQL> alter session set time_zone='EST';
    
    Session altered.
    
    SQL> select * from zeitstempel;
    
    TS
    ---------------------------------------------------------------------------
    2017-11-24 06:55:39.761283
    

Formatmasken

Ob man mit einer Anwendung oder einem Werkzeug wie SQL Developer oder SQLPlus arbeitet; jede Ausgabe einer DATE- oder TIMESTAMP Instanz ist eine Konvertierung nach VARCHAR2. Die macht man entweder mit TO_CHAR explizit - oder die Datenbank macht es implizit. Und hierfür sind die NLS-Datumsformatmasken wichtig. Für die verschiedenen Datentypen gibt es verschiedene NLS-Parameter für die Default-Formatmaske.

Weiterlesen ...

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.