2009-05-26 28 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)進行查詢,如果發現運行緩慢,請爲此添加索引表達式。