代码之家  ›  专栏  ›  技术社区  ›  Sam Wilson

如何在MySQL中存储近似日期?

  •  6
  • Sam Wilson  · 技术社区  · 16 年前

    我需要存储日期,如“1878年夏天”或“1923年6月初”,甚至“8月星期二下午”。你建议我怎么做?

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

    谢谢!

    8 回复  |  直到 16 年前
        1
  •  3
  •   Isvara    16 年前

    由于“八月星期二下午”(“拉格兰杰特岛的周日下午”?)没有指定年份,因此唯一真正的解决方案是您的所有日期和时间组件表,所有这些组件都可以为空。

    另一方面,你混淆了你的数据。

    这里有两件事(诚然是相关的):一个人类可读的字符串、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;
    

    显然,“创作日期”(艺术家创作作品的日期)与“作品中描绘的日期”完全不同,如果后者可以确定的话。

        2
  •  3
  •   Chris Arguin    16 年前

    我正在使用Postgres,我想做同样的事情。如果MySQL有一些类似的几何类型,也许你可以像我一样做: http://www.electricwords.org/2008/11/fuzzy-date-matching-in-postgresql/

        3
  •  3
  •   tpdi    16 年前

    几乎无论你做什么,你几乎肯定无法让数据库为你完成繁重的工作。所以你有两个选择: 1-如您所述,使用自然字符串 2-存储精确的数据以及该日期的精度

    例如,您可以存储“1975年9月23日下午5:10:23”、“正负6个月”,当有人想要搜索在该时间段内发生的记录时,这可能会弹出。

    这对查询没有帮助,因为据我所知,MySQL不提供任何容差支持(我所知道的其他数据库也不支持)。你必须基本上查询所有内容,然后过滤掉自己。

        4
  •  2
  •   Jeremy DeGroot    16 年前

    我认为任何MySQL原生日期表示都不适合你。如果与Unix时间戳(用 UNIX_TIMESTAMP() 以MySQL日期为参数的函数)。在选择中使用第二列(范围宽度)作为上限和下限,并确保日期列已编入索引。

        5
  •  1
  •   Sam Wilson    16 年前

    最后,我决定:为每个日期组件(年、月、日、小时、分钟、秒)设置一列,并为每个组件的范围(年_范围、月_范围、日_范围、小时_范围、分钟_范围、秒_范围)设置相应的列,主要是因为这种方法允许我指定我所知道的 当然 例如,一张特定的照片拍摄于60年代末的8月(年份=1868,年份=2,月份=8,月份=0)。

    谢谢大家的帮助!

        6
  •  0
  •   DForck42    16 年前

    创建一个表,列出您可能需要的值,如“早期”或“夏季”。那么,无论你设置了什么数据,都可以有一个根据日期设置外键的算法。

        7
  •  0
  •   James Black    16 年前

    根据Chris Arguin的回答,在第二列中,只需另一个日期时间列即可用于存储+/-,然后您应该能够编写一个使用这两列来获取近似日期时间的查询。

        8
  •  0
  •   jmucchiello    16 年前

    使用两个日期,确定模糊区域的开始和结束日期。对于像1878年夏天这样的东西,输入18780621到18780920。1923年6月初,你必须决定提前结束的时间,也许是19230601到19230610。这使得可以根据值进行选择。之后你可能仍然想过滤,但这会让你接近目标。

    对于那些没有年份的,你必须找到一个不同的系统。

    推荐文章