我正在构建一个用于管理杂志的php / sql(Laravel)应用程序。每本杂志都有一个发行日期的财产。不幸的是,对于月度期刊,此日期可以采用year-month-day
或year-month
的格式。在检索杂志时,我需要按原样查询其发布日期,这意味着year-month
仅适用于月份,而year-month-day
代表其余部分。
我能想到的唯一解决方案是添加另一列boolean
类型,例如is_monthly
,并使用它来确定问题日期格式。但我想知道是否有更好的方法将数据库中的日期存储为年份和月份,而不是一天。
答案 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');
您可以在此处找到有关设置属性的更多信息:
答案 2 :(得分:1)
如果您使用的是MySQL,那么它支持不完整的日期作为date数据类型的一部分。这可能会解决您的问题。
但是,我可能会建议您将问题日期存储为日期的字符串表示形式。我想这可能因杂志而异。然后使用日期存储用于计算的“功能”日期。功能日期可以在发布日期使用规范的日期(例如“1”)。