mysql数据类型只存储月份和年份

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.

相关:在MySQL日期字段中存储未完成的日期

  • 不幸的是,似乎在MySQL 5.7+上默认情况下不允许这种行为:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date (2认同)

Bri*_*ach 51

何必?只需将其存储为完整日期(可能始终使用第一个作为日期)并使用数据库函数MONTH(),YEAR()如果您只需要其中的一部分.这使得使用该字段变得更加容易,因为您仍然可以进行范围查询等.

  • +1使用`DATE`而是使用`EXTRACT(YEAR_MONTH FROM mydate)`进行比较,使用'DATE_FORMAT(mydate,'%Y-%M')`进行显示.别忘了另一个方便的[日期功能](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html) (5认同)
  • 如果单独存储它们,也可以进行范围查询,并且比使用MONTH()和YEAR()函数更快.如果你把它们存储在一起肯定会使用第一天,因为总有一个,你可以使用像`BETWEEN'2012-04-01'和'2012-12-01'这样的日期来搜索范围. (4认同)
  • 我同意将其存储为日期。稍后客户很可能想要输入学生的实际毕业日期。 (2认同)

Bra*_*ore 5

考虑一下如何使用数据.如果您需要创建任何报告,哪种方式可以让您更轻松地检索和处理数据?

而且您不必使用日期类型字段.你可以只有一个Year字段和一个Month字段都是整数.然后,当你真的需要做任何类型的表达时,它需要一个日期,很容易将它们放在一起并投射到一个日期.

并将日期存储为日期编号为1并且忽略它是完全可以的并且相当正常.最后,这不是一个重要的决定(相对来说),所以我会选择你最喜欢的那个并完成它.

  • 您可以将年份和月份作为整数存储在单独的列中。但 MySQL 让它稍微更痛苦,因为它不支持“CHECK(1 到 12 之间的月份)”;您必须添加一个表和一个外键约束来保证实际月份。 (2认同)

sha*_*piy 5

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

链接