作为标题,我如何设置表格列的默认值为当前年份和月份,格式为“YYYYMM”,如今为200905?
答案 0 :(得分:78)
请注意,日期的格式与存储无关。如果日期存储对您来说很重要,那么您需要定义自定义数据类型或将其存储为字符串。然后,您可以使用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')
);
答案 1 :(得分:14)
为了防止Milen A. Radev没有发布他的解决方案,就是这样:
CREATE TABLE foo (
key int PRIMARY KEY,
foo text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
答案 2 :(得分:9)
你为什么要这样做?
恕我直言,您应该将日期存储为默认类型,如果需要,请将其转换为所需格式。
您可以通过指定列的格式但使用视图来逃避。我不知道其他方法。
<强>编辑:强>
说真的,在我的意见中,您应该在具有日期类型的表上创建一个视图。我在谈论这样的事情:
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。
答案 3 :(得分:1)
感谢所有回答的人,感谢那些给我功能格式理念的人,我将真正研究它以备将来使用。
但是对于这个明确的情况,'特殊yyyymm字段'不应被视为日期字段,而只是作为标记,o用于匹配正好年月研究值的任何内容;已经有了另一个日期字段,带有完整的时间戳,但是如果我需要2008年1月的所有行,我认为选择的速度更快
SELECT [columns] FROM table WHERE yearmonth = '200801'
而不是
SELECT [columns] FROM table WHERE date BETWEEN DATE('2008-01-01') AND DATE('2008-01-31')
答案 4 :(得分:0)
这是一种常见的误解,你可以像这样对性能进行非规范化。对查询使用date_trunc('month', date)
,如果发现它运行缓慢,请为此添加索引表达式。
答案 5 :(得分:-1)
右。最好使用一个函数:
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
如有必要,请确保从Unix命令行运行createlang plpgsql
。