2016-07-23 4 views
0

Ich habe in eine Tabelle in Oracle eingefügt. Meine Implementierung ohne PLSQL wäre:ändern Datumsformat 'JJJJ/MM/TT' zu 'MM-TT-JJJJ' in Oracle

SELECT to_date('1900-01-01','YYYY-MM-DD') + (rownum - 1) AS DT_CAL, 
     rownum AS NUM_JOUR 
FROM dual 
CONNECT BY to_date('1900-01-01','YYYY-MM-DD') + (rownum - 1) <= 
                 to_date('2000-12-31','YYYY-MM-DD') 

Ergebnis ist: 05/28/1900, nicht 1900-05-28. Kannst du mir helfen zu verstehen, was das Problem ist?

Antwort

1

to_date() nimmt Ihren String-Parameter, passt ihn an das Format an, das Sie im zweiten Parameter angeben, und erstellt ein Datumsfeld daraus. Das Datumsfeld verwendet nicht das Format, das Sie im zweiten Parameter angegeben haben - tatsächlich wird es unter Verwendung einer internen Datenrepräsentation gespeichert, die überhaupt kein Format hat (höchstwahrscheinlich eine Zahl).

Um ein Format wieder aus in den Ergebnissen aus einem Datumsfeld zu präsentieren, können Sie entweder:

  1. Haben Sie den Client Ausführen der Abfrage die NLS-Parameter (auf Session-Ebene) setzen einen lokalisierten Format zur Verfügung zu stellen, mit eine ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';-Anweisung) oder
  2. Verwenden Sie to_char(..., 'YYYY-MM-DD') um Ihr vorhandenes Feld, um das Datum zurück in eine Zeichenfolge zu formatieren, wie Sie es haben möchten. Wo ersetzen Sie ... mit Ihrer aktuellen Spaltendefinition in der Auswahl.

Ansatz # 1 ist bereits im Gang, da es schon würde ein NLS_DATE_FORMAT eingestellt wird, dass das aktuelle Format produziert, aber es ist mit einem Format, das Sie wollen nicht, also wenn Sie es steuern können und es dort ändern Du kannst es so machen. Wenn Sie nicht können und Sie müssen das Format eine einzige konsistente andere Art haben, dann könnte # 2 der Weg sein.

+1

Dies ist die richtige Antwort. Für "Produktions" -Abfragen ist es immer am besten, to_char (DATE_COLUMN, '.....') mit dem gewünschten Datumsformatmodell zu verwenden, da wir die NLS-Einstellungen eines anderen Benutzers nicht steuern können; Aber für das OP, das nur Ergebnisse für sich selbst überprüft, reicht die Lösung NLS_DATE_FORMAT aus. HINWEIS bezüglich des internen Formats, das Oracle für die interne Speicherung von Daten verwendet: "BluShadow" bei OTN hat eine gute Erklärung. Um das herauszufinden, können Sie SELECT DUMP (SYSDATE) FROM DUAL ausführen und versuchen, es zu verstehen. Es ist nicht offensichtlich - aber es ist keine Nummer, es sind sieben Zahlen. – mathguy

+0

Link: https://community.oracle.com/docs/DOC-991195 – mathguy

+1

@mathguy Das Format eines Datums ist auch auf [Stackoverflow-Dokumentation] (http://stackoverflow.com/documentation/oracle/2087/dates/ 6848/the-Format eines Datums # t = 201607240002226712408). – MT0

1

Der Datentyp DATE hat kein Format; Oracle speichert es als 7- or 8-bytes und es ist nicht, bis es an ein Client-Programm übergeben wird (dh SQL/Plus, SQL-Entwickler, Toad, Java, Python, etc.) und das Client-Programm formatiert es nach den Regeln, die es hat, das Datum bekommt ein Format.

Wenn Sie SQL/Plus oder SQL Developer verwenden, wird der Sitzungsparameter NLS_DATE_FORMAT verwendet, um das Datum zu formatieren. You can change this mit:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

(Beachten Sie, dass dies nur das Format in der aktuellen Sitzung ändern und es wird nicht für andere Sitzungen/Benutzer ändern.)

Wenn Sie geben möchten das Datum ein bestimmtes Format dann müssen Sie convert it to a string.

+0

Wenn ich To_char ('2006-01-01', 'JJJJ-MM-DD') verwende, erhalte ich diesen Fehler: –

+0

ORA-00932: inkonsistente Datentypen: erwartet DATE hat NUMBER –

+2

''2006-01-01'' ist ein String-Literal und kein Datum. 'DATE '2006-01-01'' ist ein Datumsliteral. – MT0