Php 在数据库中存储完整日期或仅一年

Php 在数据库中存储完整日期或仅一年,php,mysql,date,Php,Mysql,Date,我正在做一个项目,其中有很多日期需要存储在数据库(MySQL)中 问题是,有些日期是满的,但有些日期只是一年 例如,日期如下所示: 1980年1月20日 2011年 2012年2月25日 2008年 我正在使用PHP中的函数date()和strotime()将日期转换为Y-m-d格式。已成功转换完整日期,但仅包含一年的日期被转换为今天的日期,这是错误的 问题是: 如何在PHP中成功确定哪一个是完整日期,哪一个只是一年,然后将date()和strotime()函数仅应用于完整日期 如何在数据

我正在做一个项目,其中有很多日期需要存储在数据库(MySQL)中

问题是,有些日期是满的,但有些日期只是一年

例如,日期如下所示:

  • 1980年1月20日
  • 2011年
  • 2012年2月25日
  • 2008年
我正在使用PHP中的函数
date()
strotime()
将日期转换为
Y-m-d
格式。已成功转换完整日期,但仅包含一年的日期被转换为今天的日期,这是错误的

问题是:

  • 如何在PHP中成功确定哪一个是完整日期,哪一个只是一年,然后将
    date()
    strotime()
    函数仅应用于完整日期
  • 如何在数据库中保存这些变化(完整日期和唯一年份)?(如果可能在单个列中)
  • 在从数据库获取数据时,如何知道日期是完整的还是仅仅一年,并相应地显示它
编辑:

困惑。我将在日期上进行操作,如按日期排序,包括完整日期和仅年份日期。是否:

  • 将年份存储为1990-00-00,并在检索时检查零
  • 存储年份为1990-01-01,另一个布尔字段为year
  • 将年、月和日作为整数存储在不同的列中

确保在日期的未知部分使用零。因此,请插入“2014-00-00”,而不仅仅是2014年。

您可以检查它是否是一个数字。如果是真的,那就是一年。因此,在将其转换为日期之前添加“01/01/”。这将被视为1月1日的活动。您需要一个单独的字段isYear(布尔值)来确定是年份还是日期。

要将不同的日期格式保存在数据库的同一列中,您必须将它们保存为字符串。如果您想对它们执行一些操作,这是没有意义的,但是如果您只想显示值,这是可以的。也就是说,如果您想对它们执行一些操作,我建议在db中有两列,一列表示TIMESTAMP类型的全年,一列表示year类型的年份。这样,您还可以通过检查哪一列不为null来了解正在加载的类型,从而解决另一个问题

要回答第一个问题,可以通过检查字符串长度来检查哪一个是完整日期,哪一个只是年份。如果修剪后的字符串长度超过4个字符,则必须是完整日期。不过,我会做错误处理的情况下,你有一些格式不正确的数据发送给你


阅读其他回复,例如,我不会将其设置为2014年1月1日,因为如果您的实际日期为2014年1月1日,则无法确定它是作为完整日期发送还是仅作为年份发送。或者,您可以按照此方法添加一列类型为BIT的列来表示布尔值,说明它是否为fullYear

您可以通过将给定字符串传递给以下对象来检查它是否仅指定了一年:


如果完整日期的格式一致,则可以通过检查字符串中的空格来检查是否存在完整日期

其次,如果表中有一个日期列,则可以只保存年份值,并将月份和日期保留为零

if (strstr(trim($date), ' ') !== false) {
    // space was found, this is a full date
    $mysqlDate = /* ... strtotime, etc. */
} else {
    // space was not found, this is just a year date
    $mysqlDate = trim($date) . '-00-00';
}
在选择日期时,可以通过检查日期值中的零来过滤仅限年份的日期


这不是一个很好的解决方案,但如果您打算将它们全部存储在同一列中,您会想到这个解决方案。

在数据库中存储您正在处理的对象。您可以按原样存储“John Smith”这样的名字,也可以分别存储名字和姓氏(但中间名放在哪里?:-),这取决于您的要求。对于一个系统,必须按姓氏进行筛选和排序,因此姓氏必须是一个单独的列。另一个系统可能只对全名感兴趣,而不用担心“武昌”中的哪个是第一个名字,哪个是姓氏

这里也一样。通常将日期存储为日期或日期时间列。但是你感兴趣的是一年中的哪一天和哪一个月是未知的。所以你把这些分开存放。可能具有NOTNULL约束且日和月可为空的年份

我建议对年、月和日使用单独的整数列。不要使用某种格式的字符串,这种格式是必须知道的,并且可能会时不时地被破坏


编辑:我只是注意到我还没有回答您的PHP问题:当您得到一个由四位数字组成的字符串时,它是一年,否则您可以将它转换为日期,然后它是一个日期,或者您不能,然后它是无效数据。

MySQL数据库中类似2014-00-00的日期可以接受吗?如果是,那么在执行此操作之前,如何在PHP中确定日期是一年还是完整日期?是的,这是可以接受的,这就是它的优点,您可以使用现有列。您可以将-00-00添加到仅为年的日期。当你选择它时,你可以检查它是否以-00-00结尾,看看它是一年而不是一个完整的日期。根据你的MySQL安装情况,它是可以接受的。像允许无效日期、无零日期、无零日期这样的查找模式:使用PHP的
\DateTime
和MySQL的
DateTime
,不要做石器时代的乱七八糟的字符串。许多选项会使选择更加困难:-)别担心。给出的三个选项都不是很糟糕。选择一个你认为最好的,然后使用它。
if (strstr(trim($date), ' ') !== false) {
    // space was found, this is a full date
    $mysqlDate = /* ... strtotime, etc. */
} else {
    // space was not found, this is just a year date
    $mysqlDate = trim($date) . '-00-00';
}