【问题标题】:What would be the best way to store birthdate(birthday) field with optional year用可选年份存储生日(生日)字段的最佳方法是什么
【发布时间】:2013-12-09 22:40:14
【问题描述】:

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

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

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

【问题讨论】:

  • 我个人只使用日期时间字段,您仍然可以通过 MONTH(date_column)='12' AND DAY(date_column)='6' 搜索数据库并忽略其中的年份部分只要你为那部分插入了一些通用的东西。
  • 这是几乎相同的问题,但答案很好。 stackoverflow.com/questions/4998470/…

标签: php mysql sql cakephp


【解决方案1】:

只是一个意见,但如果年份是可选的(有些人会拥有它;有些人不会)我会使用 DATE 类型并将年份设置为零。您可以像这样检查没有年份的生日:

SELECT * FROM myTable WHERE YEAR(birthdate) = 0

或者,如果 birthdate 列被索引,请改用它,因为它将是可优化的:

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

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

【讨论】:

  • 我喜欢你的方法。我个人会将年份设置为“1900”
  • 应该也可以,但是there will be a few exceptions :)
  • LOL 然后使用 1800。将死!
  • 只需使用三个单独的字段 - 日、月和年,就可以完全避免任何歧义或混淆。
【解决方案2】:

最好使用三列,日、月和年,并将年视为可选?

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

【讨论】:

  • 我认为这个选项最终会提供最少的头痛。基本上,您要存储的是出生月份和月份中的某天。作为单独的事情,您可能还存储了一年。因此,出生月份和月份日期的解决方案是两个单独的字段。一年的解决方案是另一个领域。如果在年份是可选的情况下将它们全部放入一个日期字段中,事情会变得混乱。
  • 虽然使用两个可能更干净。一个 DATE 列,然后在 (0000) 和一个 YEAR 列中放置一个虚拟年份。然后在使用时将两者组装起来。这样您就可以获得数据类型提供的所有格式、排序和数据验证,但您仍然可以忽略没有年份的年份。
【解决方案3】:

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

  1. birthdate 这是一个日期
  2. BirthdayHasYear 是一个标志(例如 tinyint)

不依赖于诸如“当年份为零时未知”之类的规则的原因是数据结构非常难以理解——在未来或者如果其他人查看它。然后我会倾向于添加一个约束条件,即“如果BirthDayHasYear 为真,那么birthdate 上的年份为0(或其他)。

或者,我将有一个birthdate 字段,然后通过以下字段的视图访问表:

  • 生日有年
  • 年龄

被定义为视图中的附加字段。在其他数据库中,我会将这种方法用于计算列。

【讨论】:

    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 2013-06-14
    • 2021-12-04
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多