我有一个数据库表,其中包含一个名为Born(type = date)的字段,其中包含人们的出生日期(例如1970-07-08)。但是,对于生日不确切知道的人,我该怎么做?
例如,一个历史人物诞生于1570年。所以我把它放在我的数据库中:1570-00-00。但它显示在1569年11月30日。
这是我正在使用的代码,其中$ Born是存储在数据库中的日期......
$Born = $row['Born'];
$Birth = DateTime::createFromFormat('Y-m-d', $Born);
我的问题应该回答@ Storing a date where only the year may be known,但我很困惑。听起来有几种选择,我不确定在我的情况下哪种选择最好。
将月份和日期与年份分开似乎很简单。所以我有一个名为Year(type = year)的字段和另一个名为Date的字段,用于月份和日期。但是我可以将后者设置为“日期”字段并插入值01-01(1月1日),或者我是否必须插入完整日期(例如1570-01-01),然后单独插入年份年度领域?
换句话说,这里有两种方法可以将1970年4月5日的日期存储在数据库表中:
年|日期 1970年| 04-05 1970年| 1970年4月5日
如果我要将日期放在两个单独的字段中,那么第一种方法可能是最简单的。或者有更好的方法吗?
以下是我如何存储仅包含一年的日期:
1988 | 1988-00-00
我的查询和显示脚本只是从Year字段中提取1988并忽略由双零(00)组成的每个值;换句话说,它会忽略第二个字段(日期)。
我还考虑过将字段保持值从“年”改为“整数”多年,因为我在过去几年中会出现“超出范围值”的错误。
由于所有的困惑,我实际上想创建三个字段 - 年,月和日 - 并且只显示“普通英语”值,如下所示:
1970 |一月| 10
这是一个好的解决方案,还是会遭受一些重大的性能损失?
答案 0 :(得分:6)
我会使用完整日期“1570-01-01
”并在您不知道确切日期的情况下将布尔字段IsExactDate
设置为False。实际上,我会在IsExactDate
上添加默认值并将其设置为True
。这样,您只需在添加非确切日期时明确地设置它。
您可以使用3个额外字段IsExactYear
,IsExactMonth
,IsExactDayDate
进行更深入的操作,以便对有限精度的历史日期进行建模。
答案 1 :(得分:1)
一方面,answer by Mitch Wheat很有意思。
另一方面,你试图将一个方形钉子推入一个圆孔。 DATE in SQL是一年+月+日。但对于这些历史数据,你没有一个月或一天,只有一年。即便如此,这一年可能只是近似的。
根据我设计和维护数据库支持系统的经验,对数据进行简单操纵或黑客攻击最终会最终导致回火。从长远来看,它总是得到“说实话”的回报。
我的意思是,在这种情况下,事实是你根本就没有一个人的生日。你有一个近似的&部分生日,仅一年或一年和一个月。部分日期不会生成DATE
SQL值。因此,如果您没有DATE值,请不要使用DATE字段/列。
在你的情况下,我会有两个字段/列:
known_birthdate_
(日期)[或许precise_birthdate_
] approximate_birthdate_
(VARCHAR)关于,您对单独的年,月和日字段的想法......可能有意义也可能没有意义。取决于您的业务问题。
您的问题无法说明您的目标是什么,您打算如何处理数据。您是否想找到某些日期之前或之后出生的人?您是否正在收集按世纪分组的历史数据?你想计算人的年龄吗?对于那些出生日期不明或不精确的人,应如何处理?如果您拼出业务逻辑和规则,您的数据结构可能会显露出来。