如何在MySQL中存储大致日期?

时间:2009-05-04 00:47:36

标签: mysql date

我需要存储日期,例如“1878年夏季”或“1923年6月初”,甚至是“八月的一个星期二中午”。你怎么建议我这样做?

我已经考虑将日期和时间分成单独的(整数)列,并为每列提供一个包含范围的辅助(整数)列(如果精确则为0;如果未知,则为NULL)。但我相信还有其他方法......

谢谢!

8 个答案:

答案 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)。

谢谢大家的帮助!