it-swarm.com.de

So stellen Sie die Postgresql-Datenbank so ein, dass das Datum dauerhaft als "MDY" angezeigt wird

Wie kann ich meine Datenbank so einstellen, dass das 'Datum' als "MDY" angezeigt wird, ohne ausgeführt zu werden:

SET datestyle = "ISO, MDY";

jedes Mal, wenn ich versuche, darauf zuzugreifen? Ich verwende Postgresql Version 9.1, Ubuntu 12.04. Mein Systemgebietsschema war zum Zeitpunkt der Datenbankinstallation auf en_CA.utf8 Festgelegt, und ich habe es kürzlich in en_US.utf8 Geändert.

show lc_CTYPE

rückgabe: -> "en_CA.UTF-8"

aber

show LC_CoLLATE

rückgabe: -> "en_CA.UTF-8"

23
Timka

Ich hatte vor Jahren ein sehr ähnliches Problem und entdeckte dann, dass ich es tun kann

ALTER DATABASE database_name SET datestyle TO "ISO, MDY";

Versuch das. (Dies funktioniert auf Datenbankbasis. Um eine Lösung für alle Ihre Datenbanken zu erhalten, setzen Sie diesen Parameter in Ihnen postgresql.conf - dank @a_horse_with_no_name.)

Bitte beachten Sie, dass die Standardeinstellung nicht vom Gebietsschema unabhängig ist. Nachdem initdb es auf den gewünschten Wert gesetzt hat, können Sie es selbst im postgresql.conf Ändern.

@ swashecks Kommentar ließ mich feststellen, dass mit meinen Einstellungen:

test=# SHOW lc_ctype;
      lc_ctype
--------------------
 Hungarian, Hungary
(1 row)


test=# SHOW lc_time;
      lc_time
--------------------
 Hungarian, Hungary
(1 row)

das Setzen von datestyle hat folgenden Effekt:

SET datestyle TO "ISO, MDY";

SELECT current_date;
    date
------------
 2012-06-21
(1 row)

Das wird jetzt nicht wirklich erwartet - und das gilt auch für einen anderen Server mit en_US.UTF8. Der Versuch, "ISO, DMY" Zu versuchen, legt auch nahe, dass der Teil "ISO" Den anderen Teil mehr oder weniger überschreibt, wenn eine Ausgabe erzeugt wird . Für Eingabewerte hat dies den erwarteten Effekt, wie in der folgenden Tabelle zusammengefasst:

                          input values
           '2016/01/21'   '01/21/2016'   '21/01/2016'         output
──────────────────────────────────────────────────────────────────────
ISO, YMD        OK             --             --            2016-01-21
ISO, DMY        --             OK             --            2016-01-21
ISO, MDY        --             --             OK            2016-01-21

- bedeutet oben, dass der angegebene Eingabestil zu einem Fehler für die angegebene Einstellung datestyle führt.

Beim sorgfältigen Lesen der Dokumentation kann man sehen, dass datestyle ein Paar teilweise widersprüchlicher Einstellungen ist:

Aus historischen Gründen enthält diese Variable zwei unabhängige Komponenten: die Ausgabeformatspezifikation (ISO, Postgres, SQL oder Deutsch) und die Eingabe-/Ausgabespezifikation für die Bestellung von Jahr/Monat/Tag (DMY, MDY oder YMD).

Für mich bedeutet dies, dass man durch ein wenig Experimentieren diejenige finden muss, die ihren Anforderungen entspricht - aber der beste Weg ist, die Standardeinstellung beizubehalten und immer ein eindeutiges Eingabeformat zu verwenden. Zwei davon sind 'YYYY-MM-DD' Und 'YYYYMMDD'. Ich bevorzuge das erstere - auch mit diesem IRL;)

Hinweis: Die Einstellung datestyle (und andere Laufzeiteinstellungen) von postgresql.conf Kann durch einen ALTER DATABASE bla SET datestyle ... Überschrieben werden, der dauerhaft für eine einzelne Datenbank festgelegt wird, oder durch SET datestyle TO ... für die aktuelle Sitzung einstellen. Letzteres kann nützlich sein, wenn Sie Daten von Drittanbietern mit einem anderen Datumsformat importieren.

34
dezso

Danke @ a_horse_with_no_name | @dezso | @ ypercubeᵀᴹ

Ich möchte eine Antwort schreiben, die einfach zu implementieren ist: Schritte

Weg 1: Einstellen des Datenstils Nur pro Datenbank

  1. show datestyle; zeige dir den aktuellen Datumsstil "ISO, DMY" oder "ISO, MDY"

  2. Nun, je nachdem, was Sie in postgres wollen [~ # ~] dmy [~ # ~] oder [~ # ~] mdy [~ # ~] set in der folgenden Abfrage

    ALTER DATABASE "my_database_name" SET datestyle TO "ISO, DMY";

    oder

    ALTER DATABASE "my_database_name" SET datestyle TO "ISO, MDY";

  3. Wichtigster Schritt: Immer nach dem Einstellen des Datenstils postgres neu starten

    Sudo service postgresql restart

    Oder

    Sudo /etc/init.d/postgresql restart

  4. Lässt die Testkonfiguration

    wenn Sie [~ # ~] dmy [~ # ~] gesetzt haben, sollte die folgende Abfrage für Sie funktionieren

    Abfrage :select '20/12/2016'::date Ausgabe :"2016-12-20"

    Oder

    wenn Sie [~ # ~] mdy [~ # ~] gesetzt haben, sollte die folgende Abfrage für Sie funktionieren

    Abfrage :select '12/19/2016'::date Ausgabe :"2016-12-19"

Way 2: Permanent: Was auch immer Sie in der Konfigurationsdatei festlegen, wird in allen Datenbanken festgelegt, die Sie in Zukunft erstellen werden

  1. In /etc/postgresql/9.3/main/postgresql.conf set

    datestyle = 'iso, dmy' OR datestyle = 'iso, mdy'

  2. Wichtigster Schritt: Immer nach dem Einstellen des Datenstils postgres neu starten

    Sudo service postgresql restart

    Oder

    Sudo /etc/init.d/postgresql restart

  3. Lässt die Testkonfiguration

    wenn Sie [~ # ~] dmy [~ # ~] gesetzt haben, sollte die folgende Abfrage für Sie funktionieren

    Abfrage :select '20/12/2016'::date Ausgabe :"2016-12-20"

    Oder

    wenn Sie [~ # ~] mdy [~ # ~] gesetzt haben, sollte die folgende Abfrage für Sie funktionieren

    Abfrage :select '12/19/2016'::date Ausgabe :"2016-12-19"

3
vijay