в postgres, вы можете установить форматирование по умолчанию для отметки времени, по сеансу или глобально? - PullRequest
9 голосов
/ 04 января 2012

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

сейчас возвращается как

2012-01-03 20:27:53.611489

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

2012-01-03 20:27

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

Ответы [ 3 ]

12 голосов
/ 24 октября 2012

В 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

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

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

Вы можете привести current_timestamp к 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
4 голосов
/ 04 января 2012

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

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

4 голосов
/ 04 января 2012

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

date_trunc('minute', now())

. Для маски input вы можете использовать:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...