в 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 нет настройки, которая по умолчанию обрезала бы секунды из литералов временных меток.