в postgres вы можете установить форматирование по умолчанию для метки времени по сеансу или глобально?

в Postgres можно ли изменить маску формата по умолчанию для метки времени?

щас вернется как

2012-01-03 20:27:53.611489

Я хотел бы разрешение на минуту такой:

2012-01-03 20:27

Я знаю, что могу сделать это на отдельных столбцах с to_char() as или раздели вниз с substr() получающим приложением, но при его правильном форматировании изначально сэкономит много работы и уменьшит количество ошибок.

3 ответов


в postgres, вы can изменить маску формата по умолчанию для datetimes-с помощью set datestyle опция; доступные опции можно найти здесь (см. 8.5.2. Вывод Даты / Времени).

к сожалению, все доступные опции включают количество секунд - поэтому вам нужно будет переформатировать их либо в запросе, либо в коде приложения (если применимо).


в PostgreSQL форматирование временных меток не зависит от хранилища. Один из ответов-использовать to_char и отформатируйте метку времени в любом формате, который вам нужен в данный момент, например:

select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;

но если вы должны установить форматирование по умолчанию:

измените формат метки времени postgresql глобально:

взгляните на свой часовой пояс, запустите это как sql-запрос:

show timezone
Result: "US/Eastern"

так когда вы печатаете вне current_timestamp, вы видите это:

select current_timestamp
Result: 2012-10-23 20:58:35.422282-04

на -04 в конце ваш часовой пояс относительно UTC. Вы можете изменить часовой пояс с помощью:

set timezone = 'US/Pacific'

затем:

select current_timestamp
Result: 2012-10-23 18:00:38.773296-07

Итак, обратите внимание на -07 вот, это означает, что мы в Тихом океане в 7 часах езды от UTC. Как мне избавиться от этого неприглядного часового пояса? Один из способов-просто сделать таблицу, по умолчанию она имеет отметку времени без часового пояса:

CREATE TABLE worse_than_fail_table
(
    mykey          INT unique not null,
    fail_date      TIMESTAMP not null
);

тогда, если вы добавите метку времени к этому таблица и выберите из нее

select fail_date from worse_than_fail_table
Result: 2012-10-23 21:09:39.335146

yay, нет часового пояса на конце. Но вы хотите больше контроля над тем, как метка времени отображается по умолчанию! Вы могли бы сделать что-то вроде этого:

CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);

это текстовое поле, которое дает вам больше контроля над тем, как она появляется по умолчанию, когда вы делаете select somecolumns from sometable. Обратите внимание, что вы можете привести строку к отметке времени:

select '2012-10-11 12:13:14.56789'::timestamp
Result: 2012-10-11 12:13:14.56789

вы могли бы бросить текущая_отметка_времени к timestamp, который удаляет часовой пояс:

select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047

вы можете избавиться от часового пояса, как это:

select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"

но если вы действительно хотите вернуть часовой пояс, вы можете сделать это:

select current_timestamp::timestamp with time zone
Result: 2012-10-23 21:20:21.256478-04

вы можете вытащить то, что вы хотите с экстрактом:

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

и это уродство:

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST';
Result: 2001-02-16 20:38:40

to_char() используется для создания строкового литерала. Если вы хотите другой timestamp значение использовать:

date_trunc('minute', now())

на вход маска Вы можете использовать:

to_timestamp('2012-01-03 20:27:53.611489', 'YYYY-MM-DD HH24:MI')

бросил timestamp without time zone путем добавления ::timestamp.

насколько мне известно, в PostgreSQL нет настройки, которая по умолчанию обрезала бы секунды из литералов временных меток.