我需要存储日期,例如“1878年夏季”或“1923年6月初”,甚至是“八月的一个星期二中午”。你怎么建议我这样做?
我已经考虑将日期和时间分成单独的(整数)列,并为每列提供一个包含范围的辅助(整数)列(如果精确则为0;如果未知,则为NULL)。但我相信还有其他方法......
谢谢!
答案 0 :(得分:3)
我正在使用Postgres,我想做同样的事情。如果MySQL有一些类似的几何类型,也许你可以像我一样做它:http://www.electricwords.org/2008/11/fuzzy-date-matching-in-postgresql/
答案 1 :(得分:3)
几乎无论你做什么,你几乎肯定无法让数据库为你做繁重的工作。所以你有两个选择: 1 - 如您所述,使用自然字符串 2 - 存储精确数据以及该日期的精确度
例如,您可以存储“1975年9月23日下午5:10:23”,“正负6个月”,当有人想要搜索在该时间范围内发生的记录时,可能会弹出。
这对查询没有帮助,因为据我所知,MySQL不提供任何容差支持(我也不知道其他任何支持)。你必须基本上查询它,然后自己过滤掉。
答案 2 :(得分:2)
自“八月的一个星期二中午”(“La Grande Jatte岛上的一个星期天下午”?)未指定一年后,唯一真正的解决方案是您所有日期和时间组件的表格,所有可空的。
另外,你正在混淆你的数据。
这里有两个(公认的相关)事物:人类可读的字符串,date_description和一系列可能的日期。
如果您可以指定至少一个范围,则可以执行以下操作:
create table artwork {
artwork_id int not null primary key,
name varchar(80),
... other columns
date_description varchar(80),
earliest_possible_creation_date datetime
latest_possible_creation_date datetime
}
insert into artwork(
name,
date_description,
earliest_possible_creation_date,
latest_possible_creation_date
) values (
'A Sunday Afternoon on the Island of La Grande Jatte',
'Mid-afternoon on a Tuesday in August'
'1884-01-01',
'1886-12-31'
), (
'Blonde Woman with Bare Breasts',
'Summer 1878'
'1878-05-01',
'1878-08-31'
), (
'Paulo on a Donkey',
'Early June 1923',
'1923-06-01'
'1923-06-15'
);
这允许您显示您想要的任何内容,并搜索:
select * from artwork
where @some_date between
earliest_possible_creation_date and latest_possible_creation_date;
显然,“创作日期”(艺术家创作作品的日期)与“作品中描绘的日期”完全不同,如果后者可以确定的话。
答案 3 :(得分:1)
我认为任何原生的MySQL日期表示都不适合你。如果与Unix时间戳配对(使用带有MySQL日期作为参数的UNIX_TIMESTAMP()
函数生成),您的双列解决方案将运行良好。使用第二列(范围宽度)作为选择的上限和下限,并确保将日期列编入索引。
答案 4 :(得分:0)
创建一个包含您可能需要的值列表的表,例如“Early”或“Summer”。然后,无论您设置数据的是什么,都可以使用根据日期设置外键的算法。
答案 5 :(得分:0)
与Chris Arguin的回答一致,在第二列中只有另一个可用于存储+/-的日期时间列,那么您应该能够编写一个使用这两列来获取大致日期时间的查询。
答案 6 :(得分:0)
使用两个日期并确定模糊区域的开始和结束日期。对于像Summer 1878这样的东西,请输入18780621到18780920.对于1923年6月初,您必须决定何时提前结束,可能是19230601到19230610.这使得可以根据值进行选择。您可能仍希望在之后进行过滤,但这会让您关闭。
对于没有年限的人,你必须找到一个不同的系统。
答案 7 :(得分:0)
最后我决定:每个日期组件(年,月,日,小时,分钟,秒)的列,以及每个日期组件的范围(year_range,month_range,day_range,hour_range) ,minute_range,second_range),主要是因为这个方法允许我指定我知道确定特定照片是在8月(例如)在60年代后期拍摄的(年份= 1868年,year_range = 2,month = 8,month_range = 0)。
谢谢大家的帮助!