2010-09-29 11 views
2

J'ai un problème avec l'affichage des dates de la base de données Oracle dans une application Web Java utilisant une base de données JSF. La date affichée diffère de la date dans la base de données.Valeur différente de l'affichage de la date entre la base de données et la table de données

Voici quelques exemples:

in oracle: 24-APR-87 display in datatable: Apr 23, 1987 
in oracle: 01-JAN-10 display in datatable: Dec 31, 2009 
in oracle: 13-MAR-89 display in datatable: Mar 12, 1989 

Voici mon code source Java:

public Result getTable() { 
    try { 
     Class.forName(dbDriver); 
     con = DriverManager.getConnection(url); 
     ps = con.createStatement(); 
     String query = "SELECT * from " + getTableName(); 
     rs = ps.executeQuery(query); 
     return(ResultSupport.toResult(rs)); 
    } catch(Exception e) { 
     return(null); 
    } 
} 

Quelle est la cause et la solution à mon problème?

+1

Le second exemple supposé être '01-JAN-10', de sorte que chaque jour jsf apparaît une journée en retard? Aussi, comment visualisez-vous les dates Oracle - SQL * Plus sur le même serveur, SQL Developer, ...? Cela ressemble peut-être à un problème de fuseau horaire, que ce soit dans la connexion à la base de données ou dans la manière dont vous manipulez la date récupérée une fois que vous l'avez récupérée. –

+0

oui, vous avez raison, c'est 01-JAN-2010, je ne connais pas ces bases de données, c'est la première fois que je les utilise à mon programme .. pouvez-vous m'aider à expaxer sur le fuseau horaire, ou peut-être un exemple et sur la connexion à la base de données et la manipulation de la date récupérée? – irwan

+0

http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – BalusC

Répondre

1

Oracle stocke les dates en utilisant un format interne qui n'a aucun rapport avec la façon dont il est formaté pour l'affichage.

Ce que vous voyez est deux formats de date différents utilisés par différentes interfaces.

Pour forcer une requête à utiliser le format de votre choix, il est préférable d'utiliser TO_CHAR, par exemple .:

SELECT TO_CHAR(mydatecolumn,'DD-MON-YYYY') FROM mytable; 
+0

Je veux que mon code puisse être utilisé pour toutes les tables. comment reconstruire mon code ci-dessus pour continuer à être utilisé par toutes les tables, mais aussi en appliquant le code TO_CHAR? – irwan

+0

Le code que vous avez dans votre question semble retourner un ensemble de résultats sans convertir les dates en chaînes - peut-être que la conversion est effectuée par l'appelant? –

+0

voici ma config-JSF: \t dataAll polimatPackage.Connection.getData demande \t \t et voici mon code jsp: \t \t \t pouvez-vous m'aider à expliquer ou faire une solution pour ces codes ... – irwan

1

Essayez d'utiliser f:convertDateTime convertisseur avec la sortie JSF et définissez l'attribut timeZone correct pour elle.
Exemple (modifier):

<h:outputText value="#{bean.myDate}"> 
    <f:convertDateTime timeZone="America/Los_Angeles" type="date" pattern="MM/dd/yyyy" /> 
</h:outputText> 
+0

pouvez-vous me donner un exemple pour cela? – irwan

+0

Oui, j'ai modifié la réponse. – Adam