web-dev-qa-db-fra.com

Conversion de date en chaîne Oracle

J'ai une colonne de chaîne COL1 quand je le fais

SELECT TO_CHAR(TO_DATE(COL1,'dd-mon-yy'), 'mm/dd/yyyy')
FROM TABLE1

Les données dans COL1 sont dans jj-juin-aa, par exemple: 27-11-89 et 89 sont 1989, mais la sélection le renvoie 11/27/2089.

Je dois faire un TO_DATE interne parce que si je ne le fais pas, je reçois une erreur de numéro invalide (ORA-01722: numéro invalide) 

Comment peut montrer 1989 au lieu de 2089? S'il vous plaît aider

11
Ram

Les données dans COL1 sont dans jj-lun-aa

Non ce n'est pas. Une colonne DATE a not un format quelconque. Il est uniquement converti (implicitement) en cette représentation par votre client SQL lorsque vous l'affichez.

Si COL1 est vraiment une colonne DATE utilisant to_date() sur elle est inutile car to_date() convertit une chaîne en DATE. 

Vous avez seulement besoin de tochar (), rien d'autre:

SELECT TO_CHAR(col1, 'mm/dd/yyyy') 
FROM TABLE1

Dans votre cas, l'appel de to_date() convertit la DATE en une valeur de caractère (en appliquant le format NLS par défaut), puis la reconvertit en DATE. En raison de cette double conversion implicite, certaines informations sont perdues en cours de route.


Modifier

Vous avez donc commis cette grave erreur de stocker une date dans une colonne de caractères. Et c'est pourquoi vous obtenez les problèmes maintenant. 

La meilleure solution (pour être honnête: la seule solution sensée) consiste à convertir cette colonne en une variable DATE. Vous pouvez ensuite convertir les valeurs en toute représentation que vous souhaitez sans vous soucier de la conversion implicite du type de données.

Mais la réponse est probablement "j'ai hérité de ce modèle, je dois y faire face}" (il l'est toujours, apparemment personne n'est jamais responsable du choix du mauvais type de données), alors vous devez utiliser RR à la place. de YY:

SELECT TO_CHAR(TO_DATE(COL1,'dd-mm-rr'), 'mm/dd/yyyy')
FROM TABLE1

devrait faire l'affaire. Notez que j'ai aussi changé mon en mm car votre exemple est 27-11-89 qui a un numéro pour le mois, pas un "mot" (comme NOV)

Pour plus de détails, voir le manuel: http://docs.Oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215

28

Essaye ça. Oracle a cette fonctionnalité pour distinguer les millénaires.

Comme vous l'avez dit, si votre colonne est un varchar, alors la requête ci-dessous vous rapportera 1989.

sélectionnez to_date (nom_colonne, 'jj/mm/rr') dans table1;

Lorsque le format rr est utilisé en année, Oracle procède comme suit.

si rr-> 00 à 49 ---> le résultat sera 2000 - 2049, si rr-> 50 à 99 ---> le résultat sera 1950 - 1999

1
Yali

Si votre colonne est de typeDATE(comme vous le dites), vous n'avez pas besoin de la convertir d'abord en chaîne (en fait, vous la convertiriez implicitement en chaîne, puis explicitement en date et encore explicitement à une chaîne):

SELECT TO_CHAR(COL1, 'mm/dd/yyyy') FROM TABLE1

Le format de date que vous voyez pour votre colonne est un artefact de l'outil que vous utilisez (TOAD, SQL Developer, etc.) et de ses paramètres de langue.

0
Codo

Une autre chose à noter est que vous essayez de convertir une date en mm/jj/aaaa mais si vous avez l’intention de comparer cette date convertie à une autre date, assurez-vous de la convertir au format aaaa-mm-jj uniquement depuis to_char littéralement. le convertit en une chaîne et avec tout autre format, nous obtiendrons un résultat non souhaité. Pour toute explication supplémentaire, suivez ceci: Comparaison de dates dans Oracle SQL

0
akshay gulawane