2014-01-18 51 views
3

我有一個名爲Born(type = date)的字段的數據庫表,其中包含人們的出生日期(例如1970-07-08)。但我如何處理那些生日不明確的人呢?僅知道一年的日期(例如1570-00-00)

例如,一個歷史人物誕生於1570年。所以我把它放在我的數據庫中:1570-00-00。但它顯示11月30日1569

這是我使用的代碼,其中$出生是存儲在數據庫中的日期...

$Born = $row['Born']; 

$Birth = DateTime::createFromFormat('Y-m-d', $Born); 

我的問題應該回答@Storing a date where only the year may be known但我困惑。這聽起來像有幾種選擇,我不確定哪個是我的最佳選擇。

看起來好像將月份和日期從年份分開一樣簡單。所以我會有一個名爲Year(類型=年)的字段和另一個名爲Date的字段在月和日。但是,我可以將後者設置爲「日期」字段並插入01-01(1月1日)等值,還是必須插入完整日期(例如1570-01-01),然後將年份單獨插入年份字段?

換一種方式,這裏有我的日期1970年4月5日存儲在數據庫表兩種方式:

年|日期 1970 | 04-05 1970 | 1970-04-05

如果我打算把日期放在兩個單獨的字段中,那麼第一種方法可能是最簡單的。還是有更好的方法呢?

而這裏的我怎麼能存儲由僅一年的時間:

1988年| 1988-00-00

我的查詢和顯示腳本只會從年份字段中提取1988年並忽略每個由雙零(00)組成的值;換句話說,它會忽略第二個字段(日期)。

我也考慮過把年份從「年」換成「整數」的字段,因爲在過去幾年裏我得到了「超出範圍值」的錯誤。

因爲所有的困惑,實際上,我想創建三個領域 - 年,月,日 - 和只顯示這樣的「純英語」的價值觀,:

1970年|一月| 10

這是一個好的解決方案,還是我會受到一些重大的性能影響?

+0

也許你可以有一個範圍。最早和最近的日期。在確切知道日期的出生的情況下,這些值將是相同的。 –

+0

您可能不會遇到性能問題,但是您肯定會將所有需要按日期進行過濾,按日期進行過濾,按日期進行過濾或對日期進行其他任何有意義的查詢複雜化。 (根據你的數據庫管理系統的不同,你也可能會遇到性能問題,每當你詢問數據庫的時候,至少應該包含一個標籤,表明你正在使用哪個數據庫 - 一個正確的答案有時取決於這些信息。) –

+0

好提示,肯;我應該說我正在使用PHP和MySQL。 –

回答

6

我會使用完整日期「1570-01-01」,並添加布爾字段IsExactDate設置爲False在您不知道具體日期的情況下。實際上,我會在IsExactDate上添加默認值並將其設置爲True。這樣,您只需在添加非確切日期時明確地設置它。

您可以進一步採用3個額外字段IsExactYear,IsExactMonth,IsExactDayDate之類的東西來建模有限精度的歷史日期。

+0

對不起,我有點困惑。什麼是布爾型字段?這聽起來像你建議我添加一個名爲「IsExactDate」的新字段到我的數據庫表中,對嗎?但是,你如何將它設置爲「假」? –

+0

好吧,它依賴於RDBMS,但在SQL Server中,布爾型字段是一個零(0)爲False的位域。 –

+0

或者您可以添加一個表示日期(年,月或日)精度的字段。 (你不能使用[MySQL'YEAR'類型](http://dev.mysql.com/doc/refman/5.1/en/year.html),因爲它只能回溯到1901.) –

1

一方面,answer by Mitch Wheat很有趣。

另一方面,您試圖將一個方形栓插入圓孔。 A DATE in SQL是一年+月+日。但對於這些歷史人物,你沒有一個月或一天,只有一年。即使如此,這一年也許只是近似的。

根據我的設計和維護數據庫支持系統的經驗,偷工減料或盜用數據總是最終會導致無法正常工作。從長遠來看,它總是能夠「說出真相」。

由此我的意思是,在這種情況下,事實是你根本沒有一個人的生日。你有一個大約&部分生日,只有一年或一年和一個月。部分日期不會生成一個DATE SQL值。因此,如果您沒有DATE值,請勿使用DATE字段/列。

你的情況我想有兩個字段/列:

  • known_birthdate_(DATE)或許precise_birthdate_]
  • approximate_birthdate_(VARCHAR)

至於,你的想法單獨的年份,月份和日期字段......這可能或可能沒有意義。取決於您的業務問題。

你的問題沒有說明你的目標是什麼,你打算如何處理數據。你是否想找到在某些日期之前或之後出生的人?你是否收集了按世紀分組的歷史人物?你想計算人的年齡?對於那些出生日期未知或不準確的人,他們應該如何處理?如果你闡明業務邏輯和規則,你的數據結構可能會暴露出來。

+0

我同意,米奇小麥可能擊中了頭部。然而,我投贊成羅勒的答案,因爲我很容易理解和實施。我只是修改我的代碼,以便如果字段birthdate中沒有值,它將從字段approximate_birthdate中提取值。 –

+0

作爲varchar存儲日期幾乎總是會導致未預料到的問題。 –

+0

@MitchWheat米奇,我們正在討論在*非DATE *字段中存儲*非日期*。同意,真正的日期值應存儲在DATE或TIMESTAMP(等)列中,以強制執行該值的完整性。但對於這些他並不真正瞭解日期(年+日+日)的情況,我建議*不要*試圖將那些不是真正的日期事物擠到DATE數據類型列中。對於那些非日期,文本(VARCHAR)是適當的。如果計算年齡或按出生日期排序比準確性更重要,那麼您的答案是適當的。正如我所說,大衛沒有完全闡明他的需求。 –

相關問題