Dan*_*oit 39 mysql sql database-design
我正在编写一个将STUDENT数据存储在MySQL关系数据库中的php应用程序.我正在尝试找到最好的方式/数据类型来存储一个月和一年没有一天.我不知道是否应该将它存储为DATE并使用php来将日期存储为第1天或者使用我目前不熟悉的其他数据类型.理想情况下,我不想存储一天,因为这一天不会总是相同,并且如果将来更改日期需要更改php源代码.
只是为了获得更多背景信息,我正在存储学生的INTENT_TO_GRAD.客户端似乎只希望将此信息作为报表的引用或可视化,而不是将其用于数据操作.换句话说,此数据的唯一功能要求是显示在报告中.
Tim*_*nen 58
它在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.
Bri*_*ach 51
何必?只需将其存储为完整日期(可能始终使用第一个作为日期)并使用数据库函数MONTH(),YEAR()如果您只需要其中的一部分.这使得使用该字段变得更加容易,因为您仍然可以进行范围查询等.
考虑一下如何使用数据.如果您需要创建任何报告,哪种方式可以让您更轻松地检索和处理数据?
而且您不必使用日期类型字段.你可以只有一个Year字段和一个Month字段都是整数.然后,当你真的需要做任何类型的表达时,它需要一个日期,很容易将它们放在一起并投射到一个日期.
并将日期存储为日期编号为1并且忽略它是完全可以的并且相当正常.最后,这不是一个重要的决定(相对来说),所以我会选择你最喜欢的那个并完成它.
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;
Run Code Online (Sandbox Code Playgroud)
背景
我有类似的问题。读完这篇文章后,我决定存储不完整的日期(带零)。它适用于较旧版本的 MySQL,但较新版本会产生“日期不正确”错误。如前所述,您可以使用该NO_ZERO_IN_DATE设置将错误转变为警告。但该设置本身已被弃用。因此,将来只能通过禁用严格模式来支持日期中的零,从而消除其他类型的错误。
由于 NO_ZERO_IN_DATE 已被弃用,因此它将在未来的 MySQL 版本中作为单独的模式名称被删除,并且其效果包含在严格 SQL 模式的效果中。
我的要求是建立表格的月度视图。我必须添加月份索引。YEAR()因此,使用和 进行即时计算MONTH()并不是一种选择。
生成的列达到了其目的。和列不是主索引的一部分,而且由于(not ) 生成的列year,我什至可以节省空间。monthVIRTUALSTORED
链接