sql >> Databasteknik >  >> RDS >> Oracle

I Oracle JDBC-drivrutinen, vad händer med tidszonen när du skriver ett Java-datum till en TIMESTAMP-kolumn?

Jag satte ihop lite JDBC-testkod för att ta reda på exakt vad som händer. Resultaten var intressanta. Oracle har tre närbesläktade datatyper:TIMESTAMP , TIDSSTÄMPEL MED TIDZON , och TIDSSTÄMPEL MED LOKAL TIDZON . Jag tog exakt samma kod och körde den från två olika rutor, en i "America/New_York"-tidszonen och en som körde på UTC. Båda träffar samma databas, körs i UTC. Jag använde Oracle 11.2.0.2.0-drivrutinen.

  • TIMESTAMP kolumnen var inställd på vilken lokal tid det än var på maskinen som körde Java-koden. Ingen tidszonöversättning utfördes.
  • TIDSSTÄMPEL MED TIDZON kolumnen översatte tiden till vilken tidszon som JDBC-klienten var i.
  • TIDSSTÄMPEL MED LOKAL TIDZON kolumnen översatte också tiden till vilken tidszon som JDBC-klienten var i.

Den här artikeln , som är lite äldre, indikerar att TIMESTAMP WITH TIME ZONE är ganska värdelös om du vill göra något som index eller partitioner. Det verkar dock som TIMESTAMP WITH LOCAL TIME ZONE kan vara extremt användbar. (Osäker på vad som händer om du ändrar serverns tidszon, men det verkar vara intelligent med JDBC-klienters lokala tidszoner). Jag har inte haft en chans att testa indexeringsbeteende etc. med dessa datatyper.

Klistra in min exempelklass nedan om du vill återskapa mina tester i din miljö.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.Date;

// create table x_tst_ts_tab(
// os_name varchar(256)
// ts timestamp,
// ts_with_tz timestamp with time zone,
// ts_with_local_tz timestamp with local time zone
// )
class TSTest {
    public static final void main(String[] argv) throws Exception {
        Class.forName("oracle.jdbc.OracleDriver");
        Connection conn = DriverManager.getConnection(
            "your_connection_string",
            "your_user_name",
            "your_password");

        try {
            // Insert some data
            Date nowDate = new Date();
            Timestamp nowTimestamp = new Timestamp(nowDate.getTime());
            PreparedStatement insertStmt = conn.prepareStatement(
                "INSERT INTO x_tst_ts_tab"
                + " (os_name, ts, ts_with_tz, ts_with_local_tz)"
                + " VALUES (?, ?, ?, ?)");
            try {
                insertStmt.setString(1, System.getProperty("os.name"));
                insertStmt.setTimestamp(2, nowTimestamp);
                insertStmt.setTimestamp(3, nowTimestamp);
                insertStmt.setTimestamp(4, nowTimestamp);
                insertStmt.executeUpdate();
            } finally {
                try {
                    insertStmt.close();
                } catch (Throwable t) {
                    // do nothing
                }
            }

            System.out.println("os_name, ts, ts_with_tz, ts_with_local_tz");

            // Read back everything in the DB
            PreparedStatement selectStmt = conn.prepareStatement(
                "SELECT os_name, ts, ts_with_tz, ts_with_local_tz"
                + " FROM dom_fraud_beacon.x_tst_ts_tab");
            ResultSet result = null;
            try {
                result = selectStmt.executeQuery();
                while (result.next()) {
                    System.out.println(
                        String.format("%s,%s,%s,%s",
                                      result.getString(1),
                                      result.getTimestamp(2).toString(),
                                      result.getTimestamp(3).toString(),
                                      result.getTimestamp(4).toString()
                                      ));
                }
            } finally {
                try {
                    result.close();
                } catch (Throwable t) {
                    // do nothing
                } finally {
                    try {
                        selectStmt.close();
                    } catch (Throwable t) {
                        // do nothing
                    }
                }
            }
        } finally {
            try {
                conn.close();
            } catch (Throwable t) {
                // do nothing
            }
        }
    }
}



  1. Read Committed är ett måste för Postgres-kompatibla distribuerade SQL-databaser

  2. Hur konverterar jag detta från TSQL till MYSQL?

  3. Oracle reguljära uttryck delad sträng från senaste förekomst

  4. CI - visa databasfel eller misslyckas