Как заголовок, как я могу установить столбец таблицы для значения по умолчанию текущего года и месяца в формате "YYYYMM", например, 200905?
Как установить значение по умолчанию для Postgresql, например "YYYYMM"?
Ответ 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, если это необходимо.