什么是存储具有可选年份的生日(生日)字段的最佳方式

时间:2013-12-06 19:56:18

标签: php mysql sql cakephp

我有mysql数据库,生日列为日期。

使用可选年份保存到此列的最佳方法是什么。我应该在其上放一些随机的年份吗?什么是在数据库中保存生日的最佳做法。

我在cakephp,日,月和年创建了3个文本字段..但不知道如何处理这个,保存在数据库中,因为如果我随机放置年份(可能是0001,因为0000不被接受),当我把它拉回来时,它会显示年份。

3 个答案:

答案 0 :(得分:1)

最好使用三个列,Day,Month和Year,并将Year视为可选项?

编辑:虽然使用两个可能更干净。一个DATE列,只是在(0000)和一个YEAR列中放入一个虚拟年份。然后在使用它们时组装两个。这样您就可以获得数据类型提供的所有格式,排序和数据验证,但是当您没有它时,您仍然可以忽略这一年

答案 1 :(得分:1)

只是一个观点,但如果年份是可选的(有些人会有;有些人不会)我会使用DATE类型并将年份设置为零。您可以查看没有年数的生日:

SELECT * FROM myTable WHERE YEAR(birthdate) = 0

或者,如果birthdate列已编入索引,请使用此列,因为它可以进行优化:

SELECT * FROM myTable WHERE birthdate <= '0000-12-31'

如果所有值都禁止使用年份 - 换句话说,您永远不会存储年份 - 我会建议单独的月份和日期列。

答案 2 :(得分:0)

最好的方法是有两个字段:

  1. birthdate这是一个日期
  2. BirthdayHasYear这是一个标志(例如tinyint)
  3. 不依赖于诸如“当年份为零然后未知”之类的规则的原因是数据结构很难理解 - 将来或者如果其他人看到它。然后,我倾向于添加一个约束,表示“如果BirthDayHasYear为真,则birthdate上的年份为0(或其他)。

    或者,我会有一个birthdate字段,然后通过视图访问该表,其中包含以下字段:

    • BirthdayHasYear
    • 年龄

    在视图中定义为其他字段。在其他数据库中,我会将此方法用于计算列。