Как установить метку даты Postgresql по умолчанию, например, «ГГГГММ»? - PullRequest
37 голосов
/ 26 мая 2009

Как заголовок, как я могу установить в столбце таблицы значение по умолчанию текущего года и месяца в формате «ГГГГММ», например, 200905 на сегодня?

Ответы [ 6 ]

78 голосов
/ 26 мая 2009

Имейте в виду, что форматирование даты не зависит от хранилища. Если для вас важно, чтобы дата хранилась в этом формате, вам нужно либо определить пользовательский тип данных, либо сохранить его в виде строки. Затем вы можете использовать комбинацию extract , приведение типов и объединение, чтобы получить этот формат.

Однако я подозреваю, что вы хотите сохранить дату и получить формат на выходе. Итак, что-то вроде этого поможет вам:

    CREATE TABLE my_table
    (
    id serial PRIMARY KEY not null,
    my_date date not null default CURRENT_DATE
    );

(CURRENT_DATE is basically a synonym for now() and a cast to date).

(отредактировано для использования to_char).

Тогда вы можете получить свой вывод как:

SELECT id, to_char(my_date, 'yyyymm') FROM my_table;

Теперь, если вам действительно действительно нужно сохранить это поле в виде строки и обеспечить формат, который вы всегда можете сделать:

CREATE TABLE my_other_table
(
id serial PRIMARY KEY not null,
my_date varchar(6) default to_char(CURRENT_DATE, 'yyyymm')
);
14 голосов
/ 26 мая 2009

На случай, если Милен Радев не успеет опубликовать свое решение, вот оно:

CREATE TABLE foo (
    key     int PRIMARY KEY,
    foo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
9 голосов
/ 26 мая 2009

Почему вы хотите это сделать?

ИМХО, вам следует сохранить дату как тип по умолчанию и при необходимости извлечь ее, преобразовав в желаемый формат.

Вы можете указать формат столбца, но с видом. Я не знаю других методов.

Отредактировано:

Серьезно, по моему мнению, вы должны создать представление для этой таблицы с типом даты. Я говорю о чем-то вроде этого:

create table sample_table ( id serial primary key, timestamp date); 

и чем

create view v_example_table as select id, to_char(date, 'yyyymmmm');

И используйте v_example_table в вашем приложении.

1 голос
/ 26 мая 2009

Спасибо всем, кто ответил, и спасибо тем, кто дал мне идею формата функции, я действительно изучу ее для будущего использования.

Но для этого явного случая «специальное поле ггггмм» следует рассматривать не как поле даты, а просто как тег, o все, что будет использоваться для сопоставления точно исследуемого значения года и месяца; уже есть другое поле даты с полной отметкой времени, но если мне нужны все строки января 2008 года, я думаю, что выбор быстрее, например

SELECT  [columns] FROM table WHERE yearmonth = '200801'

вместо

SELECT  [columns] FROM table WHERE date BETWEEN DATE('2008-01-01') AND DATE('2008-01-31')
0 голосов
/ 06 июня 2013

Это распространенное заблуждение, что вы можете денормализовать это для производительности. Используйте date_trunc('month', date) для ваших запросов и добавьте индексное выражение для этого, если вы обнаружите, что он работает медленно.

0 голосов
/ 26 мая 2009

правый. Лучше использовать функцию:

CREATE OR REPLACE FUNCTION yyyymm() RETURNS text
    LANGUAGE 'plpgsql' AS $$
DECLARE
    retval text;
    m integer;
BEGIN
    retval := EXTRACT(year from current_timestamp);
    m := EXTRACT(month from current_timestamp);
    IF m < 10 THEN retval := retval || '0'; END IF;
    RETURN retval || m;
END $$;

SELECT yyyymm();

DROP TABLE foo;
CREATE TABLE foo (
    key             int PRIMARY KEY,
    colname text DEFAULT yyyymm()
    );
INSERT INTO foo (key) VALUES (0);
SELECT * FROM FOO;

Это дает мне

 key | colname 
-----+---------
   0 | 200905

Убедитесь, что при необходимости вы запускаете createlang plpgsql из командной строки Unix.

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