Подтвердить что ты не робот

Как установить значение по умолчанию для Postgresql, например "YYYYMM"?

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

4b9b3361

Ответ 1

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

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

    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')
);

Ответ 2

На всякий случай Милен А. Радев не собирается обсуждать свое решение, это он:

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

Ответ 3

Зачем тебе это делать?

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

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

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

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

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 в своем приложении.

Ответ 4

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

Но для этого явного случая "специальное поле yyyymm" не следует рассматривать как поле даты, но точно так же, как тег, 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')

Ответ 5

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

Ответ 6

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

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, если это необходимо.