2009-08-12 1 views
0

Oracle unterstützt den TIME-Datentyp nicht, aber Sie können mit DATE TIME speichern.Wie Oracle "TIME" zu JDBC Time in Abfrage konvertieren?

Mein Problem:

select to_date('2009-06-30', 'YYYY-MM-DD') as "DATE", 
     to_date('16:31:59', 'HH24:MI:SS') as "TIME" 
from dual 

ergibt:

DATE  TIME 
2009-06-30 2009-08-01 

, wenn ich es über JDBC laufen (in SQuirrel SQL, in der Tat). "2009-08-01" ist keine sehr nützliche Zeit. In meinem Code kann ich ResultSet.getTime() verwenden. Aber wie bekomme ich die Zeit in einer generischen Abfrage? Gibt es eine Möglichkeit, das Ergebnis zu übertragen?

Antwort

1

Oracle hat keinen "Time" -Datentyp. Es hat ein DATUM, welches das Datum und die Uhrzeit auf die Sekunde genau angibt. Es hat auch einen Timestamp mit größerer Genauigkeit.

Wenn Sie einen to_date() -Aufruf ausführen, erhalten Sie einen ... DATUM! Abhängig davon, wie Sie Ihre NLS-Einstellungen eingerichtet haben, können Sie den Text für dieses Datum anzeigen lassen, wie Sie möchten. Die NLS-Einstellungen steuern Dinge wie Datumsformate, Zeitstempelformate, Währungszeichen, Dezimaltrennzeichen usw. Offensichtlich sind Ihre NLS-Einstellungen so definiert, dass sie die DATE-Daten als JJJJ-MM-TT anzeigen.

Wenn Sie versuchen, generische JDBC-Daten mit Oracle DATEs zu erstellen, müssen Sie einen "statischen" Wert für den "Tag" -Teil des Datums angeben und dann auch die Zeit angeben. Betrachten Sie folgendes Beispiel:

String sql = "Select to_date('1970-01-01 ' || ? ,'YYYY-MM-DD HH24:MI:SS) as MY_TIME from dual"; 
Connection conn = null; //get Connection from somewhere 
PreparedStatement stmt = conn.prepareStatement(sql); 
stmt.setString(1, "16:31:59"); 
ResultSet rs = stmt.executeQuery(); 
rs.next(); //get to first element of result set; 
java.sql.Time myTime = rs.getTime(1); 

Das Ergebnis myTime einen java.sql.Time Wert sein, den Wert für 16.31.59 enthält. Denken Sie daran, den Tagesabschnitt auf einem konstanten Wert zu halten (wie oben 1970-01-01), damit Abfragen mit der Zeit in der WHERE-Klausel ordnungsgemäß funktionieren.

+0

Danke. Aus irgendeinem Grund habe ich erwartet, dass die Oracle-Ingenieure einen konstanten Tagesabschnitt verwenden, wenn ich nur eine Zeit in TO_DATE() festlege. –

0

Der DATE-Typ wird als Bruchwert gespeichert - das Datum als Ganzzahl und die Tageszeit als Bruchteil. So hat jedes DATE die Zeit, die man mit so etwas extrahieren kann.

select TO_CHAR(sysdate, 'DD-MON-YYYY HH24:MI:SS') from dual; 
0

Wenn ich den Punkt erhalten Sie String Time-Wert verwenden:

select to_date('2009-06-30', 'YYYY-MM-DD') as "DATE", 
     '16:31:59' as "TIME" 
from dual; 

String time_str = ResultSet.getString("Time"); 
java.sql.Time jsqlT = java.sql.Time.valueOf(time_str); 

sollte das Ergebnis produzieren Sie benötigen.