当一些记录有 month/day/year 而其他记录只有年份时如何存储日期?
How to store dates when some records have month/day/year while other records have just the year?
我很难决定如何在我的专辑数据库中存储发行日期。有些专辑有月、日和年,但其他专辑只有年份。如果我想显示两种格式,如何存储这些发布日期?我注意到 allmusic.com 这样做了。我的同事告诉我,他认为他们将月、日和年作为单独的字段存储在数据库中,但我想这会使按时间顺序排列相册变得困难。关于如何做到这一点有什么建议吗?
我正在使用 MySQL,但我问的是关于关系数据库设计的一般问题。
'2010-01-15' 是一个日期。 “2010”不是。
有几种方法可以处理这样的数据。对年、月和日使用单独的列是一种替代方法,但它有一些缺点。
一方面,保证组合值代表真实日期很复杂,尤其是使用 MySQL。 MySQL 不强制执行 CHECK 约束。在您的特定情况下——专辑的发行日期——您可以将 CHECK 约束替换为对 table 有效日期的外键引用。
另一方面,专辑的发行日期通常对人们来说并不重要,因此您可以捍卫简化数据库结构并允许偶尔出现错误的决定日期。
另一种方法是使用 varchar(10)
来存储字符串值,例如“2010”和“2010-01-15”。 (像这样存储日期,它们将在没有类型转换的情况下正确排序。)并发症类似于使用多列(上图)。
对于专辑发行日期,我可能会使用 varchar,并忽略不良数据的潜在问题,除非有特定于应用程序的令人信服的理由来做更复杂的事情。
我会使用 DATE 类型存储日期并使用准确度列。
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 |
我很难决定如何在我的专辑数据库中存储发行日期。有些专辑有月、日和年,但其他专辑只有年份。如果我想显示两种格式,如何存储这些发布日期?我注意到 allmusic.com 这样做了。我的同事告诉我,他认为他们将月、日和年作为单独的字段存储在数据库中,但我想这会使按时间顺序排列相册变得困难。关于如何做到这一点有什么建议吗?
我正在使用 MySQL,但我问的是关于关系数据库设计的一般问题。
'2010-01-15' 是一个日期。 “2010”不是。
有几种方法可以处理这样的数据。对年、月和日使用单独的列是一种替代方法,但它有一些缺点。
一方面,保证组合值代表真实日期很复杂,尤其是使用 MySQL。 MySQL 不强制执行 CHECK 约束。在您的特定情况下——专辑的发行日期——您可以将 CHECK 约束替换为对 table 有效日期的外键引用。
另一方面,专辑的发行日期通常对人们来说并不重要,因此您可以捍卫简化数据库结构并允许偶尔出现错误的决定日期。
另一种方法是使用 varchar(10)
来存储字符串值,例如“2010”和“2010-01-15”。 (像这样存储日期,它们将在没有类型转换的情况下正确排序。)并发症类似于使用多列(上图)。
对于专辑发行日期,我可能会使用 varchar,并忽略不良数据的潜在问题,除非有特定于应用程序的令人信服的理由来做更复杂的事情。
我会使用 DATE 类型存储日期并使用准确度列。
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 |