2012-02-03 886 views
30

我正在寫一個PHP應用程序,將存儲STUDENT數據在MySQL關係數據庫中。我試圖找到最好的方式/數據類型來存儲一個月和一年沒有一天。我不知道是否應該將它作爲DATE存儲,並且使用php來存儲第一天的日期或使用我目前不熟悉的不同數據類型。理想情況下,我不想存儲一天,因爲這一天並不總是相同的,並且如果將來有所改變,將需要更改php源代碼。mysql數據類型只存儲月份和年份

只是爲了獲取更多背景信息,我正在存儲一個STUDENT的INTENT_TO_GRAD。客戶似乎只想將這些信息作爲報告的參考或可視化,而不是將其用於數據處理。換句話說,這些數據的唯一功能要求是在報告中顯示。

+1

你有沒有考慮存儲月份和年份在不同的領域SMALLINT? – 2012-02-03 19:43:29

回答

42

爲什麼要麻煩?只需將其存儲爲完整日期(也許總是使用第一天作爲日期)並使用數據庫函數MONTH()YEAR()(如果您只需要它的一部分)。這使得使用該字段,你仍然可以做範圍查詢更加容易,等

+1

我同意將它作爲日期存儲。很可能以後客戶想要輸入學生的ACTUAL畢業日期。 – 2012-02-03 19:53:59

+3

如果您也單獨存儲它們,則可以執行範圍查詢,並且比使用MONTH()和YEAR()函數更快。如果確實將它們存儲在一起,那麼肯定會使用第一天,因爲它們總是有其中之一,並且您可以使用像「BETWEEN'2012-04-01'和'2012-12-01''這樣的日期來搜索範圍。 – 2012-02-03 20:01:46

+0

@MarcusAdams,我同意表演部分,我不明白「如果你確實把它們存儲在一起,那麼肯定會使用第一天,因爲總是有這樣的一部分」。我不知道6月31日畢業的許多學生。 – 2012-02-03 23:53:27

2

我會將這兩個存儲爲兩個單獨的列作爲整數。這將使驗證蛋糕,並允許快速和容易的分類和分組的可能性。

+1

可怕的解決方案。如果你想從3個月後得到數據呢?你需要做一些怪癖,如(年x 12 +月-1)<(current_year x 12 + current_month -1 - 3),所以忘記索引 – Peter 2016-04-07 12:58:05

+1

@Peter原始問題聲明,他們只想使用數據進行顯示。我不明白你的數學如何應用。 – 2016-04-14 02:49:41

5

考慮你將如何使用數據。如果您需要創建任何報告,哪種方式可以讓您更輕鬆地檢索和處理數據?

而且您不必使用日期類型字段。您可能只有一個年份字段和一個月份字段都是整數。然後當你真的需要做任何形式的表達,需要一個日期時,很容易把它們放在一起並投射到一個日期。

並將日期編號存儲爲1並忽略它,完全沒問題,也相當正常。最後,這不是一個決定(相對而言)很重要,所以我會選擇一個你最喜歡的,並完成它。

+1

您可以將年份和月份作爲整數存儲在單獨的列中。但是MySQL使得它稍微痛苦一些,因爲它不支持'CHECK(1到12之間的月份)';你必須添加一個表和一個外鍵約束來保證實際的月份。 – 2012-02-04 00:49:31

+0

@Catcall呃,我不會添加檢查無論如何這樣對我來說不是一個問題:) – 2012-02-04 04:08:29

+0

我可能是錯的,但你不能只使用CHECK(month(in'''','2','3 ',...))...或者只是讓應用程序檢查 – 2012-02-04 05:14:39

1
SELECT * FROM Users 
WHERE 
    MONTH(DateTime) = '07' 
AND 
    YEAR(DateTime) = '2015' 
AND 
    DAY(DateTime) = '26' 

你可以像上面,但仍然篩選如果你想年/月和日存儲作爲獨立的,它的無用,直到你申請索引和其非常大的數據。

0

您可以使用VARCHAR數據類型來存儲月份和年份。

對於那些誰使用datepicker: -

1)設置VARCHAR數據類型在MySQL存儲月份和年份。2)如果你正在使用jQuery驗證,並有jquery插件日期選擇器,那麼你必須做下面的代碼。

對於前: -

<script> 

$(document).ready(function(){ 

$('#monthyear').datepicker({ 
    autoclose:true, 
    format:'mm-yy' 
}); 

//Your form validation code here// 

}); 
</script>