Como definir o banco de dados Postgresql para ver a data como "MDY" permanentemente

22

Como posso definir meu banco de dados para ver a 'data' como "MDY" sem executar:

SET datestyle = "ISO, MDY";

toda vez que estou tentando acessá-lo? Estou usando o Postgresql versão 9.1, Ubuntu 12.04. O código do idioma do sistema, no momento da instalação do banco de dados, foi definido en_CA.utf8e eu o mudei recentemente para en_US.utf8.

show lc_CTYPE

retornos: -> "en_CA.UTF-8"

mas

show LC_CoLLATE

retornos: -> "en_CA.UTF-8"

Timka
fonte

Respostas:

32

Eu costumava ter um problema muito semelhante anos atrás e depois descobri que posso fazer

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

Tente isso. (Isso funciona por banco de dados, para uma solução para todos os seus bancos de dados, defina esse parâmetro em você postgresql.conf- graças a @a_horse_with_no_name.)

Esteja ciente de que a configuração padrão não é independente da localidade . No entanto, depois de initdbconfigurá-lo para o que quiser, você pode alterá-lo você mesmo no postgresql.conf.

O comentário do @ swasheck me fez notar que, com minhas configurações:

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


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

configuração datestyletem o seguinte efeito:

SET datestyle TO "ISO, MDY";

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

Agora, isso não é realmente esperado - e é o mesmo em outro servidor en_US.UTF8também. Tentar "ISO, DMY"também me sugere que a "ISO"parte substitui mais ou menos a outra parte ao produzir uma saída . Para valores de entrada , ele tem o efeito esperado, conforme resumido na tabela abaixo:

                          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

- significa acima que o estilo de entrada especificado resulta em um erro para a datestyleconfiguração especificada .

Após uma leitura cuidadosa da documentação, percebe- datestylese um par de configurações parcialmente conflitantes:

Por razões históricas, essa variável contém dois componentes independentes: a especificação do formato de saída (ISO, Postgres, SQL ou alemão) e a especificação de entrada / saída para pedidos de ano / mês / dia (DMY, MDY ou YMD).

Para mim, isso significa que é preciso encontrar aquele que atenda às suas necessidades um pouco de experimentação - mas a melhor maneira é deixá-lo no padrão e sempre usar um formato de entrada inequívoco. Dois deles são 'YYYY-MM-DD'e 'YYYYMMDD'. Eu prefiro o primeiro - mesmo usando este IRL;)

Nota: a datestyleconfiguração (e outras configurações de tempo de execução) de postgresql.confpode ser substituída por um ALTER DATABASE bla SET datestyle ..., definindo-o permanentemente para um único banco de dados ou SET datestyle TO ...definindo-o para a sessão atual. Este último pode ser útil ao importar alguns dados de terceiros com um formato de data diferente.

dezso
fonte
3

Obrigado @a_horse_with_no_name | @dezso | @ ypercubeᵀᴹ

Quero escrever uma resposta simples de implementar: Etapas

Caminho 1 : definindo estilo de dados somente por banco de dados

  1. show datestyle;mostrar o estilo da data atual "ISO, DMY " ou "ISO, MDY"

  2. Agora, dependendo do que você deseja no postgres, DMY ou MDY definido na consulta abaixo

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

    ou

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

  3. Etapa mais importante: sempre após definir o estilo de dados, reinicie o postgres

    sudo service postgresql restart

    Ou

    sudo /etc/init.d/postgresql restart

  4. Permite testar a configuração

    se você definiu DMY abaixo, a consulta deve funcionar para você

    Consulta: select '20/12/2016'::date Saída: "2016-12-20"

    Ou

    se você definiu MDY abaixo, a consulta deve funcionar para você

    Consulta: select '12/19/2016'::date Saída: "2016-12-19"

Caminho 2 : Permanentemente: o que você definir no arquivo de configuração será definido em todos os bancos de dados que você criará no futuro

  1. No /etc/postgresql/9.3/main/postgresql.conf, defina

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

  2. Etapa mais importante: sempre após definir o estilo de dados, reinicie o postgres

    sudo service postgresql restart

    Ou

    sudo /etc/init.d/postgresql restart

  3. Permite testar a configuração

    se você definiu DMY abaixo, a consulta deve funcionar para você

    Consulta: select '20/12/2016'::date Saída: "2016-12-20"

    Ou

    se você definiu MDY abaixo, a consulta deve funcionar para você

    Consulta: select '12/19/2016'::date Saída: "2016-12-19"

vijay
fonte