【问题标题】:How to store dates when some records have month/day/year while other records have just the year?当一些记录有月/日/年而其他记录只有年时,如何存储日期?
【发布时间】:2015-04-05 08:57:29
【问题描述】:

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

我正在使用 MySQL,但这是作为关系数据库设计的一般性问题提出的。

【问题讨论】:

标签: mysql date datetime database-design


【解决方案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 |

【讨论】:

    【解决方案2】:

    '2010-01-15' 是一个日期。 '2010' 不是。

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

    一方面,保证组合值代表真实日期是复杂的,尤其是在使用 MySQL 时。 MySQL 不强制执行 CHECK 约束。在您的特定情况下(专辑的发行日期),您可以将 CHECK 约束替换为对有效日期表的外键引用。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 2016-01-11
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多