Как настроить базу данных Postgresql для постоянного отображения даты как «MDY»

22

Как я могу настроить свою базу данных, чтобы видеть дату как MDY без запуска:

SET datestyle = "ISO, MDY";

каждый раз, когда я пытаюсь получить к нему доступ? Я использую Postgresql версии 9.1, Ubuntu 12.04. На момент установки базы данных мой системный языковой стандарт был установлен, en_CA.utf8и я недавно изменил его на en_US.utf8.

show lc_CTYPE

возвращает: -> "en_CA.UTF-8"

но

show LC_CoLLATE

возвращает: -> "en_CA.UTF-8"

Тимка
источник

Ответы:

32

Раньше у меня была очень похожая проблема, а потом я обнаружил, что могу

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

Попробуй это. (Это работает для каждой базы данных, для решения для всех ваших баз данных, установите этот параметр в вас postgresql.conf- благодаря @a_horse_with_no_name.)

Помните, что настройка по умолчанию не зависит от локали . Тем не менее, после того, как вы initdbустановите все, что захотите, вы можете изменить его самостоятельно в postgresql.conf.

Комментарий @ swasheck заставил меня заметить, что с моими настройками:

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


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

Настройка datestyleимеет следующий эффект:

SET datestyle TO "ISO, MDY";

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

Теперь это не совсем ожидаемо - и то же самое на другом сервере с en_US.UTF8тоже. Попытка "ISO, DMY"тоже подсказывает мне, что эта "ISO"часть более или менее перекрывает другую часть при создании вывода . Для входных значений это имеет ожидаемый эффект, как показано в таблице ниже:

                          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

- означает выше, что данный стиль ввода приводит к ошибке для данного datestyleпараметра.

Внимательно прочитав документацию, вы увидите, что datestyleэто пара частично конфликтующих настроек:

По историческим причинам эта переменная содержит два независимых компонента: спецификацию выходного формата (ISO, Postgres, SQL или немецкий) и спецификацию ввода / вывода для упорядочивания года / месяца / дня (DMY, MDY или YMD).

Для меня это означает, что нужно немного найти тот, который соответствует их потребностям, немного поэкспериментировав, но лучший способ - оставить его по умолчанию и всегда использовать однозначный формат ввода. Два из них 'YYYY-MM-DD'и 'YYYYMMDD'. Я предпочитаю первое - даже используя этот IRL;)

Примечание. datestyleПараметр (и другие параметры времени выполнения) из postgresql.confможно переопределить ALTER DATABASE bla SET datestyle ..., установив его навсегда для отдельной базы данных или SET datestyle TO ...установив его для текущего сеанса. Последнее может быть полезно при импорте сторонних данных с другим форматом даты.

Dezso
источник
3

Спасибо @a_horse_with_no_name | @dezso | @ ypercubeᵀᴹ

Я хочу написать ответ, который прост в реализации: Шаги

Способ 1 : установка стиля даты для каждой базы данных

  1. show datestyle;показать вам текущий стиль даты "ISO, DMY " или "ISO, MDY"

  2. Теперь в зависимости от того, что вы хотите в postgres DMY или MDY, задайте запрос ниже

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

    или

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

  3. Самый важный шаг: всегда после установки стиля даты перезапускает postgres

    sudo service postgresql restart

    Или

    sudo /etc/init.d/postgresql restart

  4. Позволяет проверить конфигурацию

    если вы установили DMY ниже, запрос должен работать на вас

    Запрос: select '20/12/2016'::date Вывод: "2016-12-20"

    Или

    если вы установили MDY ниже, запрос должен работать на вас

    Запрос: select '12/19/2016'::date Вывод: "2016-12-19"

Способ 2 : постоянно: все, что вы установили в конфигурационном файле, будет установлено во всех базах данных, которые вы создадите в будущем

  1. В /etc/postgresql/9.3/main/postgresql.conf указан

    datestyle = 'iso, dmy' ИЛИ datestyle = 'iso, mdy'

  2. Самый важный шаг: всегда после установки стиля даты перезапускает postgres

    sudo service postgresql restart

    Или

    sudo /etc/init.d/postgresql restart

  3. Позволяет проверить конфигурацию

    если вы установили DMY ниже, запрос должен работать на вас

    Запрос: select '20/12/2016'::date Вывод: "2016-12-20"

    Или

    если вы установили MDY ниже, запрос должен работать на вас

    Запрос: select '12/19/2016'::date Вывод: "2016-12-19"

Виджей
источник