Zum Inhalt springen

Falsches Date-Format konvertieren


ostpower

Empfohlene Beiträge

Servus, folgende Situation:

Ich hab eine varchar2-Spalte mit Datumswerten in folgendem Format: z.b. 31-DEZ-05

Ich möchte das nun gerne konvertieren in 31.12.2005 da das das korrekte Date-Format ist.

Wie würdet ihr das machen. Ich habe mir überlegt das in Substrings zu zerlegen und umzuwandeln. Weiß aber nicht genau ob es vielleicht eine einfachere Methode gibt und wenn nicht wie ich das genau mache mit den Substrings. Kann mir vielleicht jemand weiterhelfen?

(Ich würde das dann mit SQL bzw. PL/SQL machen auf einer 10er Oracle-Datebank)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

du solltest ein Datumsfeld immer auch in einem DATE Feld speichern, das macht vieles einfacher. Falls möglich, wärs also gut, wenn Du das änderst.

Zu deinem eigentlichen Problem:

SELECT to_char(to_date(spalte,'DD-MON-YY),'DD.MM.YYYY') FROM tabelle

Mehr dazu findest Du hier TO_DATE und hier Format Models

Dim

PS: Hat das mit dem INSERT funktioniert?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ehm kann ich bei der Datums-Konvertierung auch mehrere Optionen angeben bzgl der Quelldaten? Also weil in der Ausgangsspalte nicht komplette alle Datum im Format vorliegen.

also geht in etwas sowas?

SELECT to_char(to_date(spalte,'DD-MON-YY' or 'YYYY-MM-DD'),'DD.MM.YYYY') FROM tabelle

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann hast im Client evtl. keine deutschen Ländereinstellungen.

SQL> create table test (datum date);


Tabelle wurde erstellt.


SQL> insert into test values(to_date('01.12.2008','DD.MM.YYYY'));


1 Zeile wurde erstellt.


SQL> alter session set nls_language=american;


[b]Session altered.[/b]


SQL> select to_char(datum,'DD-MON-YYYY') from test;


TO_CHAR(DAT

-----------

01-[b]DEC[/b]-2008


SQL> alter session set nls_language=german;


[b]Session wurde geändert.[/b]


SQL> select to_char(datum,'DD-MON-YYYY') from test;


TO_CHAR(DAT

-----------

01-[b]DEZ[/b]-2008

Beachte die veränderten Ausgaben. Da Du bei dir (was ich gesehen hab) wohl deutsche Monatsbezeichner drinnen hast, musst Du auf jeden Fall auch deutsche Ländereinstellungen verwenden.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Ok ich hab en ganz komisches problem. Also ich hab die Date-Formatierung schonmal erfolgreich durchgeführt, jetzt wollt ich des allerdings nochmal machen und jetzt bekomm ich auf einma ne fehlermeldung...zum verzweifeln. Also folgende Situation:

Also ich habe mir die Datums-Angaben in eine zwischentabelle kopiert. in einer spalte stehn jetzt alle datum im format DD-MON-YY und in der anderen spalte die korrekten datum im format DD.MM.YYYY

So und jetzt mach ich bzw. will ich mit folgedem update die eigentliche spalte in der ursprungstabelle updaten damit dort dann alle datum im richtigen format vorliegen.

update ursprungstabelle

set datumsspalte = (SELECT to_char(to_date(datumsspalte,'DD-MON-YY'),'DD.MM.YYYY')

FROM ursprungstabelle

where exists (

select a

from zwischentabelle

where ursprungstabelle.datumsspalte=zwischentabelle.a

));

Achso und es kommt dann der fehler

The following error has occurred:

ORA-01843: not a valid month

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok ich hab en ganz komisches problem. Also ich hab die Date-Formatierung schonmal erfolgreich durchgeführt, jetzt wollt ich des allerdings nochmal machen und jetzt bekomm ich auf einma ne fehlermeldung...zum verzweifeln. Also folgende Situation:

Also ich habe mir die Datums-Angaben in eine zwischentabelle kopiert. in einer spalte stehn jetzt alle datum im format DD-MON-YY und in der anderen spalte die korrekten datum im format DD.MM.YYYY

So und jetzt mach ich bzw. will ich mit folgedem update die eigentliche spalte in der ursprungstabelle updaten damit dort dann alle datum im richtigen format vorliegen.

update ursprungstabelle

set datumsspalte = (SELECT to_char(to_date(datumsspalte,'DD-MON-YY'),'DD.MM.YYYY')

FROM ursprungstabelle

where exists (

select a

from zwischentabelle

where ursprungstabelle.datumsspalte=zwischentabelle.a

));

- Ja, und was kommt für eine Fehlermeldung ? To many row's in Subquery ?

- und speichere doch, wenn du eh schon dabei bist, die konvertierten Daten in eine neues Feld vom Typ DATE....das erspart dir viel Ärger in der Zukunft....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie meinst du das jetzt? also welche Date-spalte in welcher tabelle jetzt?

Er meint (und ich auch), dass du in deiner Ursprungstabelle ein neues Feld vom TYP DATE erstellst und deine Datumswerte ab nun dort speichern sollst. Datumswerte gehören IMMER Attribute vom Typ DATE

Gruss

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah STOP die falsche datumstyp-anzeige war durch die sprache, mit american geht das, aber ich bekomme dann folgende fehlermeldung, das hast du (dbwizard) doch auch gemeint, also an was liegt das?

The following error has occurred:

ORA-01427: single-row subquery returns more than one row

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also nochmal zum verständnis ich führe folgenden code aus:

update ursprungstabelle

set datumsspalte = (SELECT to_char(to_date(datumsspalte,'DD-MON-YY'),'DD.MM.YYYY')

FROM ursprungstabelle

where exists (

select a

from zwischentabelle

where ursprungstabelle.datumsspalte=zwischentabelle.a

));

und bekomme diese fehlermeldung:

The following error has occurred:

ORA-01427: single-row subquery returns more than one row

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah STOP die falsche datumstyp-anzeige war durch die sprache, mit american geht das, aber ich bekomme dann folgende fehlermeldung, das hast du (dbwizard) doch auch gemeint, also an was liegt das?

The following error has occurred:

ORA-01427: single-row subquery returns more than one row

- Nun ja, eigentlich genau das, was die Meldung auch besagt...Kurz gesagt, versuchst du in EIN Feld (Datumsspalte) mehr als genau EINEN Wert zu speichern, d.h. das Resultat von (SELECT to_char(to_date(datumsspalte,'DD-MON-YY'),'DD.MM.YYYY')...etc liefert dir mehr als einen Datensatz zurück...und das passt nicht ...Das ist natürlich auch klar, da du keine 1:1 Beziehung zwischen deinen alten Datumswerten und den neuen hast....

Gruss

Link zu diesem Kommentar
Auf anderen Seiten teilen

warum denn nur ein feld? mit "set datumspalte" änder ich doch ALLE Felder in dieser spalte die mit der where-klausel ausgewählt werden. Also es sollen in der datumsspalte alle werte geändert werden die gleich denen aus der spalte a der zwischentabelle sind, das sind die datums mit dem format DD-MON-YY

Link zu diesem Kommentar
Auf anderen Seiten teilen

warum denn nur ein feld? mit "set datumspalte" änder ich doch ALLE Felder in dieser spalte die mit der where-klausel ausgewählt werden. Also es sollen in der datumsspalte alle werte geändert werden die gleich denen aus der spalte a der zwischentabelle sind, das sind die datums mit dem format DD-MON-YY

Nein. Dieser Teil deiner Abfrage :

(SELECT to_char(to_date(datumsspalte,'DD-MON-YY'),'DD.MM.YYYY')

FROM ursprungstabelle

where exists (

select a

from zwischentabelle

where ursprungstabelle.datumsspalte=zwischentabelle.a

))

...gibt dir für jeweils eine Zeile der Ursprungstabelle mehr als EINEN Wert zurück...Wie soll die DB wissen, welchen wert aus der Subquery nun in die Ursprungsspalte geschrieben werden soll ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich steh grad aufm schlauch, also wie soll ich des dann denn sonst lösen?

also ich hab in der datumsspalte der ursprungstabelle folgende werte stehn:

Datum

------

12.10.2006

12.10.2006

14-MAR-07

20-JUL-05

20-JUL-05

20-JUL-05

11.06.2006

31.03.2007

Und ich möchte alle Werte mit dem Format DD-MON-YY in das Format DD.MM.YYYY umwandeln

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich steh grad aufm schlauch, also wie soll ich des dann denn sonst lösen?

also ich hab in der datumsspalte der ursprungstabelle folgende werte stehn:

Datum

------

12.10.2006

12.10.2006

14-MAR-07

20-JUL-05

20-JUL-05

20-JUL-05

11.06.2006

31.03.2007

Und ich möchte alle Werte mit dem Format DD-MON-YY in das Format DD.MM.YYYY umwandeln

- OK :-)--... ich würde so vorgehen :

1. Neues Attribut [NeuesDatumsFeld] (oder wie auch immer du dies bezeichnen willst) in der [ursprungstabelle] : vom Typ DATE (unbedingt :-))

2. Update Ursprungstabelle SET NeuesDatumsFeld = (to_date(AltesDatumsfeld,[HierDeinGewünschtesDatumsFormat])

3. Überprüfen, ob alles korrekt im neuen Feld ist

4. Eventuell Views / Code / etc anpassen, so dass ab nun neues Feld verwendet wird.

Gruss

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...