2016-09-07 21 views
3

我在Postgres的PubMed上存儲期刊論文的數據,我想存儲論文的發表日期。但是,有時日期爲just a year(請參閱PubDate字段),有時候是一個月和一年,有時候是日,月和年。如何在postgres中以不同級別的精度存儲日期?

在我的數據庫中存儲這些數據的明智方式是什麼?

如果我使用Postgres日期字段,我顯然需要指定日期和月份,但在某些情況下我需要發明它們,並且我不喜歡丟失有關日期的信息的想法精確。

對於我的目的我認爲我只需要一年,但我不知道這是真實的所有可能的未來目的。

也許我應該有daymonthyear文本字段,然後我可以隨時將其轉換爲日期字段,將來如果我需要他們?

+0

是的,你最後的建議對我來說似乎很合理。你也可以添加一個'CHECK'約束來檢查如果'day'不是null,那麼'month'也不是null。另一種方法是創建日期列和第二列以指示日期列的準確性。 – redneb

+0

Postgres中的[ISO-8601可能的重複:如何在類型日期只插入年份? (不完整的日期時間值)](http://stackoverflow.com/questions/21599997/iso-8601-in-postgres-how-to-insert-only-year-in-type-date-incomplete-date-tim ) – moooeeeep

回答

1

我會將它存儲爲date並存儲精度。

例如:

CREATE TYPE date_prec AS ENUM ('day', 'month', 'year'); 

CREATE TABLE pub (
    pub_id integer PRIMARY KEY, 
    pub_date date NOT NULL, 
    pub_date_prec date_prec NOT NULL 
); 

然後你就可以查詢該表是這樣的:

SELECT pub_id, date_trunc(pub_date_prec::text, pub_date)::date FROM pub; 

pub_date忽略任何「隨機」天和月份值。

0

你可以有一個日期字段,並有另一個字段 - 可以說'dateflag'的整數類型。您有使用完整日期的值爲1,使用日期和月份爲2,僅使用年份爲3。通過這種方式檢索數據時,您會知道該怎麼做。當然,對於選擇2和3,在插入時,除了一年之外,還需要輸入一個虛擬的日期/月份。

你對3個領域的想法也是完全有效的 - 但它需要大量的檢查來確保你保持日期的神聖性(就像是如果有一天 - 那麼月必須在那裏,天的價值規則和幾個月等)。