记录强制年份和月份的日期的最佳方式,仅限可选日期

时间:2015-10-16 17:15:59

标签: php sql date datetime laravel

我正在构建一个用于管理杂志的php / sql(Laravel)应用程序。每本杂志都有一个发行日期的财产。不幸的是,对于月度期刊,此日期可以采用year-month-dayyear-month的格式。在检索杂志时,我需要按原样查询其发布日期,这意味着year-month仅适用于月份,而year-month-day代表其余部分。

我能想到的唯一解决方案是添加另一列boolean类型,例如is_monthly,并使用它来确定问题日期格式。但我想知道是否有更好的方法将数据库中的日期存储为年份和月份,而不是一天。

3 个答案:

答案 0 :(得分:2)

您可以存储为3列(年/月/日):

<强> SqlFiddleDemo

CREATE TABLE magazine(title VARCHAR(100), `year` INT NOT NULL,
                      month TINYINT NOT NULL, day TINYINT NULL);

INSERT INTO magazine
VALUES ('aaa', 2015, 10, 16), ('bbb', 2015, 11, NULL);

SELECT 
    title,
    CASE WHEN day IS NULL THEN CONCAT(`year`, '-' , month)
         ELSE CONCAT(`year`, '-' , month, '-', day)
     END AS `publish_date`
FROM magazine

输出:

╔════════╦══════════════╗
║ title  ║ publish_date ║
╠════════╬══════════════╣
║ aaa    ║ 2015-10-16   ║
║ bbb    ║ 2015-11      ║
╚════════╩══════════════╝

答案 1 :(得分:2)

是的,我更倾向于采用boolean列说is_monthly的方法,因为从长远来看,它可以让您更好地控制您的方法。

您可以将date设置为Carbon个实例,并在模型中定义一个mutator说setIssueDateAttribute($date),并默认日期的某一部分,以便说出该月的第一天没有可用的日期值,即如果is_monthly设置为true

通过这种方式,您可以简单地将日期存储在数据库中而不会有任何麻烦,当您希望仅显示日期的月份和年份时,您可以将其设为

$this->attributes['issue_date'] = Carbon::setToStringFormat('F, Y');
在你的`getIssueDateAttribute($ date)访问器中。

您可以在此处找到有关设置属性的更多信息:

Laravel Tutorial on Dates, Scope and Mutators

Accessors and Mutators Laravel Documentation

答案 2 :(得分:1)

如果您使用的是MySQL,那么它支持不完整的日期作为date数据类型的一部分。这可能会解决您的问题。

但是,我可能会建议您将问题日期存储为日期的字符串表示形式。我想这可能因杂志而异。然后使用日期存储用于计算的“功能”日期。功能日期可以在发布日期使用规范的日期(例如“1”)。