Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅知道年份的日期(例如1570-00-00)_Php_Mysql_Date - Fatal编程技术网

Php 仅知道年份的日期(例如1570-00-00)

Php 仅知道年份的日期(例如1570-00-00),php,mysql,date,Php,Mysql,Date,我有一个数据库表,其中有一个名为Born(type=date)的字段,它显示了人们的出生日期(例如1970-07-08)。但是我该怎么对待那些不知道确切生日的人呢 例如,一位历史人物诞生于1570年。所以我把这个放进了我的数据库:1570-00-00。但它显示的是1569年11月30日 这是我正在使用的代码,$Born是存储在数据库中的日期 $Born = $row['Born']; $Birth = DateTime::createFromFormat('Y-m-d', $Born); 我

我有一个数据库表,其中有一个名为Born(type=date)的字段,它显示了人们的出生日期(例如1970-07-08)。但是我该怎么对待那些不知道确切生日的人呢

例如,一位历史人物诞生于1570年。所以我把这个放进了我的数据库:1570-00-00。但它显示的是1569年11月30日

这是我正在使用的代码,$Born是存储在数据库中的日期

$Born = $row['Born'];

$Birth = DateTime::createFromFormat('Y-m-d', $Born);
我的问题应该得到回答,但我很困惑。听起来好像有几个选择,我不确定哪一个是我的最佳选择

把月份和日期与年份分开似乎很简单。因此,我有一个名为Year(type=Year)的字段,另一个名为Date的字段表示月份和日期。但我可以将后者设置为“日期”字段并插入01-01(1月1日)之类的值,还是必须插入完整的日期(例如1570-01-01),然后在年份字段中单独插入年份

换句话说,有两种方法可以将1970年4月5日的日期存储在数据库表中:

年份|日期 1970 | 04-05 1970年| 1970-04-05

如果我将日期放在两个单独的字段中,那么第一个方法可能是最简单的。还是有更好的方法

下面是我如何存储仅由一年组成的日期:

1988年| 1988-00-00

我的查询和显示脚本只是从年份字段中提取1988,并忽略由双零(00)组成的每个值;换句话说,它将忽略第二个字段(日期)

我还考虑过将保存年份值的字段从“year”更改为“integer”,因为我在较老的年份会出现“outofrange value”错误

由于所有的混乱,我实际上在考虑创建三个字段-年、月和日-并显示“纯英语”值,如下所示:

1970年1月10日

这是一个正常的解决方案,还是会对性能造成重大影响?

我会使用完整日期“
1570-01-01
”,并在不知道确切日期的情况下添加一个布尔字段
IsExactDate
,设置为False。事实上,我会在
IsExactDate
上添加一个默认值,并将其设置为
True
。这样,您只需在添加不精确的日期时明确地设置它

您可以使用类似于3个额外字段
IsExactYear
IsExactMonth
IsExactDayDate
的内容对精度有限的历史日期进行建模。一方面,这是很有趣的

另一方面,你试图把一个方形的钉子塞进一个圆孔里。A是年+月+日。但对于这些历史人物,你没有一个月或一天,只有一年。即便如此,这一年也可能只是一个大概的年份

根据我设计和维护数据库支持系统的经验,jerry操纵或入侵数据最终总是适得其反。从长远来看,“说实话”总是值得的

我的意思是,在这种情况下,事实是,有些人根本没有生日。你有一个大概的部分生日,只有一年或一年和一个月。部分日期不构成
date
SQL值。因此,如果没有日期值,就不要使用日期字段/列

在您的情况下,我将有两个字段/列:

  • 已知的出生日期
    (日期)[或者可能
    精确的出生日期
    ]
  • 大约出生日期(VARCHAR)

关于,您对单独的年、月和日字段的想法……可能有意义,也可能没有意义。这取决于你的业务问题


你的问题没有说明你的目标是什么,你打算用这些数据做什么。你是在寻找在特定日期之前还是之后出生的人?你在收集历史人物按世纪分类吗?你想计算人们的年龄吗?对于那些出生日期不明或不准确的人,应该如何处理?如果您详细说明了业务逻辑和规则,您的数据结构可能会显示出来。

也许您可以有一个范围。最早和最晚的日期。在已知日期的情况下,这些值肯定是相同的。您可能不会受到性能影响,但您肯定会使任何需要按日期筛选、按日期排序、按日期分组或对日期执行任何其他有意义的操作的查询复杂化。(取决于你的数据库管理系统,你的性能也可能会受到影响。每当你询问数据库时,至少要包括一个标记,表明你正在使用哪个数据库-正确的答案有时取决于该信息。)好提示,肯;我应该说我正在使用PHP和MySQL。我已经在你的问题中添加了这些标记。顺便说一句,将1570-00-00解释为1569年11月30日是有意义的;离1570-01-01还有一个月零一天。对不起,我有点困惑。什么是布尔域?听起来你是建议我在数据库表中添加一个名为“IsExactDate”的新字段,对吗?但是如何将其设置为“False”?这取决于RDBMS,但在SQL Server中,布尔字段是一个位字段,零(0)为False。或者您可以添加一个字段,指示日期(年、月或日)的精度。(你不能使用,因为它只能追溯到1901年。)我同意,米奇·麦特可能一针见血。然而,我投票赞成巴兹尔的答案,因为它对我来说很容易理解和实现。我将修改我的代码,以便如果字段birthdate中没有值,它将从字段approxist_birthdate中提取一个值。将日期存储为varchar几乎总是会在以后导致意外问题。@MitchWheat Mitch,我们讨论的是将非日期存储在非日期字段中。同意,真实日期值应存储在日期或时间戳(等)列中,以强制执行值的完整性。但在这些情况下,他并不真正知道日期