【发布时间】:2017-02-21 08:49:24
【问题描述】:
给出的是包含一段时间的数据,跨越数年。就像这样:
| ID | Name | Alive |
|----|--------------------|-----------------------|
| 1 | Washington, George | 1732-02-22/1799-12-14 |
| 2 | Adams, John | 1735-10-30/1826-07-04 |
| 3 | Jefferson, Thomas | 1743-04-13/1826-07-04 |
…
是否可以通过搜索中间日期(在所有字段中,仅一年)(如搜索词 1788)产生结果的方式将这些数据存储在 MySQL 中?
我正在寻找的是这样的:
CREATE TABLE t (
id INT NOT NULL,
name VARCHAR(30),
alive DATERANGE
);
SELECT * FROM t WHERE * LIKE '%1788%'
我看到的唯一解决方案是添加另一个包含年份列表的列 (1732,1733,...),但我想有更好的解决方案。我需要一个或两个字段中的日期吗?我需要什么列类型才能使它起作用?我可以在该列中指定日期范围(例如1155/1227)还是必须在插入之前重写它们(例如1155-01-01/1227-12-31)?
边界匹配也应返回。搜索字符串 1799 仍应返回 George Washington,即使他在 1 月 1 日至 12 月 31 日(含)期间都不在世。我想这很简单,因为它已经是一个字符串匹配了。
【问题讨论】:
-
您应该将开始日期和结束日期放在两个单独的列中,并使用正确的日期列类型而不是文本。
-
我同意@CBroe,你可以
select * from t where YEAR(startDate) = 1788 OR YEAR(endDate) = 1788 -
@TheFlash 您应该将您的评论作为答案并将
=替换为><,这是我正在寻找的范围。 -
@Paramaeleon 我添加了答案,谢谢