当某些记录有月/日/年而其他记录只有一年时,如何存储日期?

时间:2015-04-05 08:57:29

标签: mysql date datetime database-design

我无法决定如何在我的相册数据库中存储发布日期。有些专辑有月,日和年,但其他专辑只有一年。如果我想显示这两种格式,如何存储这些发布日期?我注意到allmusic.com这样做了。我的同事告诉我,他认为他们将月,日和年存储为数据库中的单独字段,但我想这会使按时间顺序排列相册变得困难。有关如何做到这一点的任何建议?

我正在使用MySQL,但我问这是关于关系数据库设计的一般问题。

2 个答案:

答案 0 :(得分:1)

'2010-01-15'是一个约会。 '2010'不是。

有几种方法可以处理这样的数据。使用单独的列年,月和日是一种替代方案,但它有一些缺点。

一方面,保证组合值代表实际日期很复杂,尤其是使用MySQL。 MySQL不强制执行CHECK约束。在您的特定情况下 - 相册的发布日期 - 您可以使用对有效日期表的外键引用替换CHECK约束。

另一方面,专辑的发布日期通常对人们来说非常重要,因此您可以捍卫决定简化数据库结构并允许偶尔出现错误日期。

另一种方法是使用varchar(10)来存储字符串值,例如“2010”和“2010-01-15”。 (存储这样的日期,并且它们将在没有类型转换的情况下正确排序。)并发症类似于使用多个列(上图)。

对于专辑发布日期,我可能会使用varchar,并忽略潜在的错误数据问题,除非有特定于应用程序的令人信服的理由做更复杂的事情。

答案 1 :(得分:1)

我会使用DATE类型存储日期并使用精确列。

SQL Fiddle

MySQL架构

CREATE TABLE Album(
  Title               VARCHAR(40),
  ReleaseDate         DATE,
  ReleaseDateAccuracy ENUM('D', 'M', 'Y')
);

INSERT INTO Album
  (Title, ReleaseDate, ReleaseDateAccuracy)
VALUES
  ('Foo', '2015-01-01', 'Y'),
  ('Bar', '2015-04-01', 'M'),
  ('Baz', '2015-04-06', 'D');

<强>查询

SELECT Title,
  CASE ReleaseDateAccuracy
    WHEN 'Y' THEN DATE_FORMAT(ReleaseDate, '%Y')
    WHEN 'M' THEN DATE_FORMAT(ReleaseDate, '%Y-%m')
    WHEN 'D' THEN DATE_FORMAT(ReleaseDate, '%Y-%m-%d')
  END AS FormattedDate
  FROM Album

<强>结果:

| Title | FormattedDate |
|-------|---------------|
|   Foo |          2015 |
|   Bar |       2015-04 |
|   Baz |    2015-04-06 |