2009-08-12 13 views
0

Oracle ne prend pas en charge le type de données TIME, mais vous pouvez utiliser DATE pour stocker un TIME.Comment convertir Oracle "TIME" à JDBC Time dans la requête?

Mon problème:

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

rendements:

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

quand je le lance via JDBC (dans SQL Écureuil, en fait). "2009-08-01" n'est pas un moment très utile. Dans mon code, je peux utiliser ResultSet.getTime(). Mais comment puis-je avoir le temps dans une requête générique? Y a-t-il un moyen de lancer le résultat?

Répondre

1

Oracle n'a pas de type de données "Time". Il a une DATE, qui est la date et l'heure précises à la seconde. Il a également un horodatage avec une plus grande précision.

Lorsque vous effectuez un appel to_date(), vous obtenez une date ... DATE! Selon la façon dont vous avez défini vos paramètres NLS, vous pouvez afficher le texte de cette date comme vous le souhaitez. Les paramètres NLS contrôlent des choses comme les formats de date, les formats d'horodatage, les caractères monétaires, les séparateurs décimaux, etc. Il est évident que vos paramètres NLS sont définis pour afficher les données DATE sous la forme aaaa-mm-jj.

Si vous essayez de créer des composants JDBC génériques avec des DATES Oracle, vous devez spécifier une valeur "statique" pour la partie "jour" de la date, puis spécifier l'heure. Considérez cet exemple:

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); 

Le résultat de monTemps sera une valeur java.sql.Time contenant la valeur de 16:31:59. N'oubliez pas de conserver la valeur du jour pour la valeur constante (comme le 1970-01-01 ci-dessus) afin que les requêtes avec la clause Time dans la clause where fonctionnent correctement.

+0

Merci. Pour une raison quelconque, je m'attendais à ce que les ingénieurs d'Oracle utilisent une partie de jour constante quand je ne spécifie qu'une heure dans TO_DATE(). –

0

Le type DATE est stocké en tant que valeur fractionnaire - la date en tant que partie entière et l'heure du jour en tant que partie fractionnaire. Donc, chaque DATE a le temps, que vous pouvez extraire avec quelque chose comme ça.

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

Si je reçois le point que vous pouvez utiliser Valeur chaîne Time:

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); 

il devrait produire le résultat dont vous avez besoin.