2009-05-08 4 views
0

Say I question:Oracle - comment créer une date à partir d'une date déjà existante?

select date_field from table1; 

date_field est comme '25 .11.2009' Je vais essayer de changer les positions des champs de date avec le mois et vice versa. (Bien sûr pour les jours> 12 quelques manipulations)

TO_DATE(MOD(SUBSTR(TO_CHAR(a.A_DATE, 'DD.MM.YYYY'), 4, 2), 12) || '.' || 
       SUBSTR(TO_CHAR(a.A_DATE, 'DD.MM.YYYY'), 1, 2) || 
       SUBSTR(TO_CHAR(a.A_DATE, 'DD.MM.YYYY'), 6, 4), 
      'DD.MM.YYYY') 

LA CHOSE EST QUE LA VALEUR DE RETOURNER fonction MOD() est un numéro, par exemple pour 01.07.2009 -> je reçois 1 pour ce jour, pas '01 ' comme prévu. Plus tard, je ne peux pas obtenir la date. Existe-t-il une solution de raccourci à mon problème?

Répondre

0

yli> "Je suis en quelque sorte en train d'anonymiser la date, en réalité la date d'embauche des employés, à utiliser dans un environnement de test."

Donc, voici votre exigence réelle. Si vous souhaitez modifier certaines dates, vous n'avez pas besoin d'utiliser les fonctions de conversion date/chaîne (TO_CHAR/TO_DATE). Oracle prend directement en charge les opérations arithmétiques sur les valeurs de date.

Si vous voulez randomiser vos dates pourquoi ne pas simplement utiliser quelque chose comme:

select date_field + dbms_random.value * 100 from table1; 
0

Est-ce que cela fonctionne?

TO_DATE(TO_CHAR(a.A_DATE, 'DD/MM/YYYY'), 'MM/DD/YYYY') 
+0

me donne « ORA-01843 pas un mois valide » erreur. – yli

+2

Bien sûr, parce que les jours vont de 1 à 31, tandis que les mois doivent être entre 1 et 12. Qui pose la question - qu'est-ce que vous essayez même d'accomplir? –

+0

Je suis en quelque sorte anonymiser la date, en réalité la date de location des employés, à utiliser dans un environnement de test. – yli

1

I utilisés: CASE MOD (substr (TO_CHAR (a.birthday, 'DD.MM.YYYY'), 1, 2), 12) QUAND PUIS 1 '01' QUAND PUIS 2 ' 02' QUAND 3 ALORS '03' QUAND 4 Then '04' QUAND 5 ALORS '05' QUAND 6 Then '06' QUAND 7 Then '07' QUAND 8 Then '08' QUAND 9 ALORS '09 ' QUAND 10' 10 ' QUAND 11' 11 ' QUAND 12 THEN' 12 ' FIN pas très élégant mais fonctionne :)

+1

LPAD (TO_CHAR (un.anniversaire, 'DD'), 2, '0') –

+0

Désolé, LPAD (MOD (TO_CHAR (a.anniversaire, 'DD', 2, '0'), 12)) –

+0

En fait, yli, cela ne fonctionnera pas pour toutes les entrées possibles car la sortie de l'expression MOD sera comprise entre 0 et 11, pas entre 1 et 12. –

0

Avez-vous essayé TO_CHAR(<date>, '<format>')?

4

Je suppose que vous devez sérieusement reconsidérer ce que vous essayez de faire.

Je pense que vous avez commencé avec, vous voulez simplement changer la mise en forme de la date, par exemple. remplacer '25 .11.2009' par '11.25.25.2009 '.

Si date_field est réellement un type DATE, il n'y a pas de formatage inhérent stocké dans le champ. C'est une valeur numérique représentant une date et une heure spécifiques. Il est formaté en texte lorsque vous le sélectionnez dans SQLPlus ou un autre outil, mais cette mise en forme n'est pas stockée dans la table.

Si vous souhaitez afficher la date dans un format particulier, vous utilisez la fonction TO_CHAR pour le forcer. Vous pouvez également définir un modèle de format par défaut pour une seule session, un seul client ou la base de données entière à l'aide de NLS_DATE_FORMAT.