我正在编写一个将STUDENT数据存储在MySQL关系数据库中的php应用程序。我正在尝试找到最好的方式/数据类型来存储一个月和一年没有一天。我不知道是否应该将它存储为DATE并使用php来将日期存储为第1天或者使用我目前不熟悉的其他数据类型。理想情况下,我不想存储一天,因为这一天并不总是相同的,并且如果将来某一天发生变化,则需要更改php源代码。
只是为了获得更多背景信息,我正在存储学生的INTENT_TO_GRAD。客户端似乎只希望将此信息作为报表的引用或可视化,而不是将其用于数据操作。换句话说,此数据的唯一功能要求是显示在报告中。
答案 0 :(得分:56)
它在MySQL手册中说你可以存储部分日期
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format
由于月份和日期说明符的范围从零开始 事实上,MySQL允许存储不完整的日期,如 '2014-00-00'。
这意味着只存储年份和月份,您可以使用DATE
列并放置00
而不是当天。例如2013-12-00
。
答案 1 :(得分:49)
为什么要这么麻烦?只需将其存储为完整日期(可能始终使用第一个作为日期)并使用数据库函数MONTH()
和YEAR()
(如果您只需要它的一部分)。这使得使用该字段变得更加容易,因为您仍然可以进行范围查询等。
答案 2 :(得分:5)
考虑如何使用数据。如果您需要创建任何报告,哪种方式可以让您更轻松地检索和处理数据?
您不必使用日期类型字段。你可以只有一个Year字段和一个Month字段都是整数。然后,当你真的需要做任何需要日期的表达式时,很容易将它们放在一起并投射到日期。
将日期数字存储为1,只是忽略它是完全可以的,也很正常。最后,这不是一个重要的决定(相对来说),所以我会选择你最喜欢的那个并完成它。
答案 3 :(得分:3)
我将两个列作为整数存储为两个单独的列。它可以制作验证蛋糕,并允许快速简便的分类和分组。
答案 4 :(得分:2)
SELECT * FROM Users
WHERE
MONTH(DateTime) = '07'
AND
YEAR(DateTime) = '2015'
AND
DAY(DateTime) = '26'
你可以像上面那样进行过滤,但如果你想将年/月和日分开存储,那么在你应用索引及其非常大的数据之前,它是无用的。
答案 5 :(得分:0)
另一种解决方案是从DATETIME
/ DATE
源生成生成的列。
ALTER TABLE stats
ADD COLUMN year SMALLINT GENERATED ALWAYS AS (YEAR(stat_date)) NOT NULL,
ADD COLUMN month smallint GENERATED ALWAYS AS (MONTH(stat_date)) NOT NULL;
背景
我有类似的问题。阅读此线程后,我决定存储不完整的日期(带零)。它适用于旧版本的MySQL,但新版本会产生“日期不正确”错误。如前所述,您可以使用NO_ZERO_IN_DATE
设置将错误变为警告。但是该设置本身已被弃用。因此,将来,只有通过禁用严格模式从而禁用其他类型的错误 ,才能在日期中支持零。
因为不建议使用NO_ZERO_IN_DATE,它将在以后的MySQL版本中作为单独的模式名称删除,并且其影响包括在严格的SQL模式的影响中。
我的要求是建立一个表格的每月视图。我必须在一个月上添加一个索引。因此,无法选择使用YEAR()
和MONTH()
即时计算飞蛾。
生成的列达到了目的。 year
和month
列不是主索引的一部分,由于VIRTUAL
(不是STORED
)生成的列,我什至可以节省空间。
链接
答案 6 :(得分:0)
从5.7开始,可以使用生成的列,这使您可以强制实现年月唯一性,同时还可以在另一个字段上使用日期函数,而不会通过重复操作破坏数据完整性:
CREATE TABLE `year_month` (
`Year` int(11) NOT NULL,
`Month` enum(
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
) NOT NULL,
`GENERATED_YearMonth` date
GENERATED ALWAYS AS
((makedate(`Year`,1) + interval (`Month` - 1) month))
STORED,
PRIMARY KEY (`Year`,`Month`),
KEY `year_month_GENERATED_YearMonth_index` (`GENERATED_YearMonth`)
)
;
答案 7 :(得分:-1)
您可以使用VARCHAR
数据类型仅存储月份和年份。
对于使用datepicker
的人: -
1)在mysql中设置VARCHAR数据类型以存储月份和年份。
2)如果您正在使用jquery验证并拥有jquery插件日期选择器,那么您必须执行以下代码。
例如: -
<script>
$(document).ready(function (){
$('#monthyear').datepicker({
autoclose:true,
format:'mm-yy'
});
//Your form validation code here//
});
</script>