2012-02-03 884 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>