'DD-MON-RR' Datum-format-Muster nicht wie erwartet funktioniert
Ich bin dem einfügen eine Abfrage mit dem format als
to_date('25-JUN-13','DD-MON-RR')
In oracle es ist in Ordnung, und der Ausgang ist als 25-JUN-13
.
In postgresql die gleiche Arbeit, wie 0001-06-25 BC
.
Es ist ein migration Projekt aus der oracle-Datenbank auf postgresql. Jede Lösung, die für die gleichen arbeiten, wie es im Fall von oracle.
Nicht richtig arbeiten, wenn ich mit der DD-MM-YY - format, dann ist das Ergebnis sehr viel anders.
AUSFÜHREN DIESER ABFRAGE werden IN einer POSTGRESQL -->
select to_char(to_date('25-JUN-53','DD-MON-YY'),'YYYY') as YEAR
ANSWER IS --> 2053
Beim abrufen das gleiche Ergebnis in oracle aus der Abfrage als
select to_char(to_date('25-JUN-53','DD-MON-RR'),'YYYY') as YEAR from dual
ASSWER IS --> 1953
So, ich bin der Migration das Projekt die gleiche Funktionalität, die es sein sollte in der Postgresql so, dass das Endergebnis sollte das gleiche sein.
- wollen Sie Jahr ah?
- warum sind Sie geben im Jahr nur 2-stellige
- Ich bin abrufen der Werte aus der Tabelle in diesem format nur .
Du musst angemeldet sein, um einen Kommentar abzugeben.
Natürlich ist es korrekt funktioniert. Pro Dokumentation:
So,
70
wird zu 1970, aber69
wird 2069.Oracle hat unterschiedliche Regeln für die Formatbezeichner
RR
(die nicht vorhanden ist in Postgres), grundsätzlich kann das Jahr eingestellt werden nächsten Jahr 2000 (das nächste Jahrhundert bis zum aktuellen Datum):Abhilfe
Ich würde die Kapselung der Funktionalität in einer Funktion, die wechselt das Jahrhundert nach der Jahr-Zahl im string. Da Postgres erlaubt das überladen von Funktionen verwenden, können Sie auch die gleiche Funktion name
to_date()
mit unterschiedlichen parameter-Typen.Gemäß der Dokumentation oben, Oracle umschlingt bei YY = '50' und diese Funktion ist äquivalent bis 2049:
Nur
STABLE
, nichtIMMUTABLE
, weil to_date ist nurSTABLE
. Was Sie deaktivieren Funktions-inlining.Wählte ich
varchar
für den ersten parameter werden von der ursprünglichen unterscheidet, die verwendettext
.Wenn das Jahr Nummer > 49, die Funktion fügt die 20th century (mit '19') else, der 21st in die Zeichenkette für das Datum vor der Umwandlung. Der zweite parameter ist ignoriert.
Nennen:
Unserem custom-Funktion ignoriert den 2. parameter sowieso.
Ergebnis:
SQL Fiddle.
Könnten Sie es noch ausgeklügelter machen, arbeiten jenseits 2049 und nehmen Sie den zweiten parameter in Betracht ...
Ein Wort der Warnung: überladen von Funktionen über die Grundfunktionen ist besser, mit Sorgfalt geschehen. Wenn das in Ihrem system bleibt von jemanden bekommen überraschende Ergebnisse später.
Besser erstellen, die Funktion in einem speziellen schema und legen Sie die
search_path
selektiv so, es wird nur verwendet, wenn angemessen. Man kann auchtext
als parameter geben Sie in diesem Fall:Dann:
Oder verwenden temporäre Funktion. Siehe:
RR
ist sehr verwirrendHier ist eine Beispielfunktion, die ich schrieb, um dieses Problem zu lösen. Ich arbeitete auf der gleichen migration. Hoffe, es hilft u irgendwie. Sie können es über die Funktion überladen, obwohl, nur benennen Sie die Funktion als u wie.