2011-02-14 82 views
23

我在計算將數據存儲在數據庫中的最佳方法時遇到了問題。我必須將DD/MM日期存儲在數據庫中,但我不確定存儲這些數據的最佳方式,以便可以輕鬆地對其進行分類和搜索。存儲日期和月份(不含年份)

基本上用戶將能夠以格式DD/MM格式保存重要的日期,他們將被提醒更接近當天。

DATE數據類型似乎並不完全適用,因爲它包含年份,但我想不出另一種存儲此數據的方式。在所有場合結束時都可以包含特定的一年,但這似乎不太合適。

+1

對不起,但我無法想象爲什麼你會盡量避免一年,當你不知道一年的時候,點什麼?但你可以使用字符串作爲字段的類型,並在其中保存月份和日期 – 2011-02-14 23:22:40

+3

我會使用日期類型,它不會傷害到即使沒有使用一年存在,更大的未來靈活性,優化的存儲等。 – 2011-02-14 23:24:18

+2

@Senad I'我並不想避開這一年,而只是說它不是我感興趣的數據。例如,我不需要知道第一次正式的澳大利亞國慶日是在1818年。相反,我只是對存儲它在26/1。 – Sasha 2011-02-15 00:15:01

回答

40

我必須在數據庫中存儲DD/MM的日期,但我不確定存儲這個最好的方法,以便它可以很容易地排序和搜索。

存儲最新數據的最佳方式,即使不需要分量年份,是使用日期。當您需要使用它時,可以刪除年份,或者將其與當年(或當年)進行比較來替換。

有它的日期列利於排序正確,完整性,有效性

爲迎合閏年,用一年,如「0004」,它可以「0004-02-29」。使用年4使得它略高於年0更復雜,但作爲一個例子,這原來的時間'29 -Feb」(年不可知)插入在該年份的日期進行比較與一些其它字段

select 
    adddate(
    subdate(cast('0004-02-29' as date), 
     interval 4 year), 
     interval year(curdate()) year) 

result: 2011-02-28 
5

這些日期是否重複出現?如果不是,你將如何跟蹤何時「過期」?如果答案是「應用程序會在日期過期後手動刪除日期」,那麼爲什麼不簡單地將DD/MM日期作爲下一個可用日期的實例?例如:

01/02變得2012-02-0104\07成爲2011-07-04

內置的日期/時間功能是非常有用,所以我強烈建議你使用varcharstinyints

2

如果你真的真的想放棄這一年,那麼只需製作兩列,一個白天,一個月。然後分開存儲它們。

CREATE TABLE `table-name` (
    `Day` tinyint NOT NULL, 
    `Month` tinyint NOT NULL 
); 

但是,它更好只使用Date類型,然後忽略一年在你的代碼。

相關問題