Show TOC Anfang des Inhaltsbereichs

Hintergrunddokumentation Semantik der Datentypen DATE, TIME und TIMESTAMP  Dokument im Navigationsbaum lokalisieren

Der JDBC-Standard definert zwar die Datentypen DATE, TIME und TIMESTAMP, lässt es aber offen, inwieweit diese Datentypen Zeitzoneninformationen beinhalten. Darüberhinaus bleibt es der jeweiligen Implementierung überlassen, inwieweit Zeitzoneninformationen abgelegt werden oder auch nicht.

Dieser Mangel wird von Open JDBC behoben. Open JDBC bietet dem Anwender eine über alle Datenbankplattformen einheitliche Semantik bezüglich der Zeittypen.

Datentyp TIMESTAMP

TIMESTAMP repräsentiert in Open SQL einen UTC Zeitstempel mit Zeitzoneninformation, der weltweit einen Zeitpunkt festlegt. Folglich werden Daten vom Typ TIMESTAMP in der Datenbank in der Zeitzone UTC abgelegt. Damit sind Zeitstempelwerte auf der Datenbank unabhängig von der Zeitzone der Anwendung, die den Wert erzeugt hat und unabhängig von der Zeitzone der Datenbankinstanz. Ein zeitzonenunabhängiger Vergleich der Zeitstempelwerte ist damit möglich.

Die Repräsentation von TIMESTAMP Daten als Objekt erfolgt durch die Klasse java.sql.Timestamp.

Daten werden von der Datenbank mit ResultSet.getTimestamp geholt und mit PreparedStatement.setTimestamp zur Datenbank gebracht.

Ein neues java.sql.Timestamp  Objekt kann mit Hilfe seines Konstruktors java.sql.Timestamp.Timestamp(int ms) erzeugt werden. Das Argument ist die Anzahl Sekunden * 1000 zwischen dem Zeitpunkt und der Epoche (01.01.1970 00:00:00.000 UTC). Nur ganze Sekunden werden über alle Datenbankplattformen hinweg unterstützt.

Dieser Wert kann mit der Methode Timestamp.getTime wieder erhalten werden.

Beispiel

import java.sql.SQLException;

 

long now = System.currentTimeMillis()

 

java.sql.Timestamp timestamp = new java.sql.Timestamp(now);

 

PreparedStatement stmt =

    conn.prepareStatement("insert into RESERVATION "

                        + "(ID,  RESERVATION_TIMESTAMP)"

                        + "values (23, ?)");

try {

    stmt.setTimestamp(1, timestamp);

    stmt.executeUpdate();

} finally {

    stmt.close();

}

Datentyp TIME

Im Unterschied zu TIMESTAMP ist die Bedeutung des JDBC Typen TIME in Open SQL eine Uhrzeit ohne Zeitzone. Er dient ausschließlich zur Abspeicherung fester Uhrzeiten wie zum Beispiel 12 Uhr mittags. Durch diese Festlegung sind Zeitwerte auf der Datenbank unabhängig von der Zeitzone der Anwendung, die den Wert erzeugt hat und unabhängig von der Zeitzone der Datenbankinstanz. Ein zeitzonenunabhängiger Vergleich der Zeitwerte ist möglich.

Die Repräsentation von TIME Daten als Objekt erfolgt durch die Klasse java.sql.Time.

Daten werden von der Datenbank mit ResultSet.getTime geholt und mit PreparedStatement.setTime zur Datenbank gebracht.

Ein neues java.sql.Time Objekt kann mit Hilfe der statischen Methode java.sql.Time.valueOf(String jdbcEncodedTime) erhalten werden. Der String jdbcEncodedString muss das Format "hh:mm:ss" haben. Nur durch diese statische Methode ist garantiert, dass das erzeugte java.sql.Time Objekt nach JDBC-Standard korrekt normiert ist (Ein java.sql.TimeArgument muss nach JDBC-Standard so normiert sein, dass seine Datumsanteile den Wert 01.01.1970 ergeben.)

Die Uhrzeit, die von einem java.sql.Time Objekt repräsentiert wird, lässt sich über die Methode java.sql.Time.toStringwieder als String im Format "hh:mm:ss" erhalten.

Vorsicht: java.sql.Timeimplementiert zwar das Interface Comparable, verletzt aber dessen Kontrakt. Auch der Kontrakt von java.lang.Object.equals wird von java.sql.Time verletzt. Daher sollten die Methoden java.sql.Time.compareTound java.sql.Time.equals nicht verwendet werden.

 

Datentyp DATE

Auch der JDBC Datentyp DATE ist in Open SQL nicht zeitzonenbehaftet.  Er dient zur Abspeicherung zeitzonenunabhängiger Termine wie zum Beispiel Hochzeits- oder Geburtstagen.

Die Repräsentation von DATE Daten als Objekt erfolgt durch die Klasse java.sql.Date.

Daten werden von der Datenbank mit ResultSet.getDate geholt und mit PreparedStatement.setDate zur Datenbank gebracht.

Ein neues java.sql.Date Objekt kann mit Hilfe der statischen Methode java.sql.Date.valueOf(String jdbcEncodedDate) erhalten werden. Der String jdbcEncodedDate muss das Format "YYYY-MM-DD" haben. Nur durch diese statische Methode ist garantiert, dass das erzeugte java.sql.Date Objekt nach JDBC-Standard korrekt normiert ist (Ein java.sql.DateArgument muss nach JDBC-Standard so normiert sein, dass seine Zeitanteile in der lokalen Zeitzone den Wert 00:00:00 ergeben.)

Das java.sql.Date Argument muss nach JDBC-Standard so normiert sein, dass seine Zeitanteile bezogen auf die lokale Zeitzone den Wert 00:00:00.000 haben.

Das Datum, das von einem java.sql.Date Objekt repräsentiert wird, läßt sich über die Methode java.sql.Date.toString wieder als String im Format "hh:mm:ss" erhalten.

Achtung

java.sql.Date implementiert zwar das Interface Comparable, verletzt aber dessen Kontrakt. Auch der Kontrakt von java.lang.Object.equals wird von java.sql.Date verletzt. Daher sollten die Methoden java.sql.Date.compareTound java.sql.Date.equals nicht verwendet werden.

 

import java.sql.SQLException;

 

String dateString = "2003-03-24";

 

java.sql.Date date = new java.sql.Date.valueOf(dateString);

 

PreparedStatement stmt =

    conn.prepareStatement("insert into RESERVATION "

                        + "(ID,  RESERVATION_DATE)"

                        + "values (23, ?)");

try {

    stmt.setDate(1, date);

    stmt.executeUpdate();

} finally {

    stmt.close();

}

 

 

 

Ende des Inhaltsbereichs