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

时间:2012-02-03 19:38:48

标签: mysql sql database-design

我正在编写一个将STUDENT数据存储在MySQL关系数据库中的php应用程序。我正在尝试找到最好的方式/数据类型来存储一个月和一年没有一天。我不知道是否应该将它存储为DATE并使用php来将日期存储为第1天或者使用我目前不熟悉的其他数据类型。理想情况下,我不想存储一天,因为这一天并不总是相同的,并且如果将来某一天发生变化,则需要更改php源代码。

只是为了获得更多背景信息,我正在存储学生的INTENT_TO_GRAD。客户端似乎只希望将此信息作为报表的引用或可视化,而不是将其用于数据操作。换句话说,此数据的唯一功能要求是显示在报告中。

8 个答案:

答案 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

相关:Store incomplete date in MySQL date field

答案 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()即时计算飞蛾。

生成的列达到了目的。 yearmonth列不是主索引的一部分,由于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>