2009-05-08 3 views
0

Say I Ausgabe:Oracle - Wie erstelle ich ein Datum aus einem bereits vorhandenen Datum?

select date_field from table1; 

DATE_FIELD wie '25 ist .11.2009' Ich werde versuchen, die Positionen der Datumsfelder mit dem Monat zu wechseln und umgekehrt. (Natürlich für Tage> 12 einige Manipulationen)

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

Die Sache ist die, dass der Wert VON MOD() zurück Funktion eine Zahl ist, dh für 01.07.2009 -> Ich erhalte 1 für Datum, nicht '01 ' wie erwartet. Später kann ich das Datum nicht bekommen. Gibt es eine Abkürzung Lösung für mein Problem?

Antwort

0

yli> "Ich bin irgendwie Anonymisierung des Datums, tatsächlich Einstellungsdatum der Mitarbeiter, in einer Testumgebung verwendet werden."

Also hier war Ihre tatsächliche Anforderung. Wenn Sie einige Daten ändern möchten, müssen Sie die Datum/String-Konvertierungsfunktionen (TO_CHAR/TO_DATE) überhaupt nicht verwenden. Oracle unterstützt arithmetische Operationen für Datumswerte direkt.

Wenn Sie möchten, um Ihre Daten randomisieren, warum etwas gerade nicht wie verwenden:

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

Funktioniert das?

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

gibt mir „ORA-01843 nicht einen gültigen Monat“ Fehler. – yli

+2

Natürlich, weil die Tage zwischen 1 und 31 liegen, während die Monate zwischen 1 und 12 liegen müssen. Das wirft die Frage auf - was wollen Sie überhaupt erreichen? –

+0

Ich bin irgendwie Anonymisierung des Datums, tatsächlich Einstellungsdatum der Mitarbeiter, in einer Testumgebung verwendet werden. – yli

1

I verwendet: CASE MOD (SUBSTR (TO_CHAR (a.birthday, 'DD.MM.YYYY'), 1, 2), 12), wenn man 1 THEN '01', wenn 2 THEN ' 02' WHEN 3 THEN '03' WHEN 4 THEN '04' WHEN 5 THEN '05' WHEN 6 THEN '06' WENN DANN 7 '07' WHEN 8 THEN '08' WHEN 9 THEN '09 ' WANN 10 DANN' 10 ' WANN 11 DANN' 11 ' WANN 12 DANN' 12 ' ENDE nicht sehr elegant, aber funktioniert :)

+1

LPAD (TO_CHAR (a.birthday, 'DD'), 2, '0') –

+0

Entschuldigung, LPAD (MOD (TO_CHAR (a.Geburtstag, 'DD', 2, '0'), 12)) –

+0

Eigentlich yli, das wird nicht für alle möglichen Eingaben funktionieren, da die Ausgabe des MOD-Ausdrucks zwischen 0 und 11 liegt, nicht zwischen 1 und 12. –

0

Haben Sie versucht TO_CHAR(<date>, '<format>')?

4

Ich vermute, Sie müssen ernsthaft überdenken, was Sie versuchen zu tun.

Ich denke, was Sie damit begonnen haben, ist, dass Sie einfach die Formatierung des Datums, z. ändern "25 .11.2009" bis "11 .25.2009".

Wenn date_field tatsächlich ein DATE-Typ ist, wird keine inhärente Formatierung im Feld gespeichert. Es ist ein numerischer Wert, der ein bestimmtes Datum und eine bestimmte Uhrzeit darstellt. Es wird in Text formatiert, wenn Sie es in SQLPlus oder einem anderen Tool auswählen, aber diese Formatierung wird nicht in der Tabelle gespeichert.

Wenn Sie das Datum in einem bestimmten Format anzeigen möchten, verwenden Sie die TO_CHAR-Funktion, um es zu erzwingen. Sie können auch ein Standardformatmodell für eine einzelne Sitzung, einen einzelnen Client oder die gesamte Datenbank mit NLS_DATE_FORMAT festlegen.