2009-05-26 27 views

回答

68

请注意,日期的格式与存储无关。如果以这种格式存储日期为对您至关重要,您将需要定义自定义数据类型或将其存储为字符串。然后,您可以使用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') 
); 
8

为什么要这么做?

恕我直言,你应该存储日期作为默认类型,如果需要获取它转换为所需的格式。

你可以避开指定列的格式,但有一个视图。我不知道其他方法。

编辑:

严重的是,在我的oppinion,你应该创建一个以日期类型表的视图。我说的是这样的:

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。

+0

因为我需要它。我有一个PHP应用程序,运行并查询数据库与'200801','200802'等''yyyymm',以检索数据的 - 我想你有它作为默认值会更好,然后SELECT fiels FROM table WHERE column BETWEEN timestamp1 AND timestamp2 – Strae 2009-05-26 14:00:44

+0

我会用我添加到我的回复中的解决方案来做到这一点。 – 2009-05-27 11:51:52

-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,如果需要的话。

+0

或者在psql中做“create language plpgsql”,这是所有的createlang所做的。 – araqnid 2009-05-27 12:00:41

13

万一米伦A.拉德夫没有得到周围张贴他的解决办法,这是它:

CREATE TABLE foo (
    key  int PRIMARY KEY, 
    foo  text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM') 
); 
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') 
0

这是一个常见误解你可以像这样去规范性能。使用date_trunc('month', date)进行查询,如果发现运行缓慢,请为此添加索引表达式。