Comment définir la base de données Postgresql pour voir la date en tant que «MDY» en permanence

22

Comment puis-je configurer ma base de données pour voir la «date» comme «MDY» sans exécuter:

SET datestyle = "ISO, MDY";

à chaque fois que j'essaie d'y accéder? J'utilise Postgresql version 9.1, Ubuntu 12.04. Les paramètres régionaux de mon système, au moment de l'installation de la base de données, ont été définis sur en_CA.utf8et je l'ai récemment changé en en_US.utf8.

show lc_CTYPE

renvoie: -> "en_CA.UTF-8"

mais

show LC_CoLLATE

renvoie: -> "en_CA.UTF-8"

Timka
la source

Réponses:

32

J'ai eu un problème très similaire il y a des années, puis j'ai découvert que je pouvais faire

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

Essayez ça. (Cela fonctionne sur une base par base de données, pour une solution pour toutes vos bases de données, définissez ce paramètre en vous postgresql.conf- grâce à @a_horse_with_no_name.)

Veuillez noter que le paramètre par défaut n'est pas indépendant des paramètres régionaux . Cependant, après l'avoir initdbréglé sur ce qu'il veut, vous pouvez le changer vous-même dans le postgresql.conf.

Le commentaire de @ swasheck m'a fait remarquer qu'avec mes paramètres:

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


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

ce paramètre datestylea l'effet suivant:

SET datestyle TO "ISO, MDY";

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

Maintenant, ce n'est pas vraiment prévu - et c'est la même chose sur un autre serveur avec en_US.UTF8, aussi. Essayer "ISO, DMY", aussi, me suggère que la "ISO"partie est plus ou moins prioritaire sur l'autre partie lors de la production d'une sortie . Pour les valeurs d' entrée , il a l'effet attendu, comme résumé dans le tableau ci-dessous:

                          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

- signifie au-dessus que le style d'entrée donné entraîne une erreur pour le datestyleparamètre donné .

En lisant attentivement la documentation, on peut voir qu'il datestyles'agit d'une paire de paramètres partiellement conflictuels:

Pour des raisons historiques, cette variable contient deux composants indépendants: la spécification du format de sortie (ISO, Postgres, SQL ou allemand) et la spécification d'entrée / sortie pour la commande année / mois / jour (DMY, MDY ou YMD).

Pour moi, cela signifie qu'il faut trouver celui qui correspond à leurs besoins par un peu d'expérimentation - mais la meilleure façon est de le laisser par défaut et de toujours utiliser un format d'entrée sans ambiguïté. Deux d'entre eux sont 'YYYY-MM-DD'et 'YYYYMMDD'. Je préfère l'ancien - même en utilisant cet IRL;)

Remarque: le datestyleparamètre (et les autres paramètres d'exécution) de postgresql.confpeut être remplacé par un ALTER DATABASE bla SET datestyle ..., le définissant de manière permanente pour une seule base de données ou en le SET datestyle TO ...définissant pour la session en cours. Ce dernier peut être utile lors de l'importation de certaines données tierces avec un format de date différent.

dezso
la source
3

Merci @a_horse_with_no_name | @dezso | @ ypercubeᵀᴹ

Je veux écrire une réponse simple à mettre en œuvre: étapes

Méthode 1 : définition du style de données par base de données uniquement

  1. show datestyle;affiche le style de date actuel "ISO, DMY " ou "ISO, MDY"

  2. Maintenant, en fonction de ce que vous voulez en postgres DMY ou MDY défini dans la requête ci-dessous

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

    ou

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

  3. Étape la plus importante: toujours après avoir défini les postgres de redémarrage du style de données

    sudo service postgresql restart

    Ou

    sudo /etc/init.d/postgresql restart

  4. Permet de tester la configuration

    si vous avez défini DMY ci-dessous, la requête devrait fonctionner pour vous

    Requête: select '20/12/2016'::date Sortie: "2016-12-20"

    Ou

    si vous avez défini MDY ci-dessous, la requête devrait fonctionner pour vous

    Requête: select '12/19/2016'::date Sortie: "2016-12-19"

Méthode 2 : en permanence: tout ce que vous définissez dans le fichier de configuration sera défini dans toutes les bases de données que vous créerez à l'avenir

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

    datestyle = 'iso, dmy' OU datestyle = 'iso, mdy'

  2. Étape la plus importante: toujours après avoir défini les postgres de redémarrage du style de données

    sudo service postgresql restart

    Ou

    sudo /etc/init.d/postgresql restart

  3. Permet de tester la configuration

    si vous avez défini DMY ci-dessous, la requête devrait fonctionner pour vous

    Requête: select '20/12/2016'::date Sortie: "2016-12-20"

    Ou

    si vous avez défini MDY ci-dessous, la requête devrait fonctionner pour vous

    Requête: select '12/19/2016'::date Sortie: "2016-12-19"

vijay
la source