【问题标题】:How to store approximate dates in MySQL?如何在 MySQL 中存储大致日期?
【发布时间】:2009-05-04 00:47:36
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 这取决于您打算如何使用和查询它。如果您能提供这些信息,我们将能够为您提供更好的帮助。
  • 这是一个旧照片目录,我的目标是一种按时间顺序排序的好方法,因为通常没有明确的年表(!)——一个日期时间类型伴随着第二个日期时间类型(范围:+-1 年、+-6 小时等)是我最接近的。

标签: mysql date


【解决方案1】:

由于“8 月星期二的中午”(“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;

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

【讨论】:

  • 我认为这种开始和结束日期的结构是可行的方法。这似乎是最简单和最不可靠的。并在两个日期之间的中点订购,你觉得呢? (我必须说,您的数据示例非常恰当!)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我认为任何原生 MySQL 日期表示都不适合您。如果与 Unix 时间戳配对(使用 UNIX_TIMESTAMP() 函数生成,并以 MySQL 日期作为参数),您的两列解决方案将运行良好。使用第二列(范围宽度)作为选择的上限和下限,并确保日期列已编入索引。

      【讨论】:

        【解决方案5】:

        最后我决定:为每个日期组件(年、月、日、小时、分钟、秒)创建一个列,并为每个组件的范围(year_range、month_range、day_range、hour_range)提供相应的列, minute_range, second_range),主要是因为此方法允许我指定我确定确定某张特定照片是在 60 年代后期的 8 月(例如)拍摄的(year=1868, year_range= 2,月=8,月范围=0)。

        感谢大家的帮助!

        【讨论】:

          【解决方案6】:

          创建一个包含您可能需要的值列表的表格,例如“Early”或“Summer”。那么无论你如何设置数据,都可以有一个根据日期设置外键的算法。

          【讨论】:

          • 我认为日期范围的人工术语列表对于用户选择日期非常有用(但我认为底层存储的日期应该是硬性的日期时间)。
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-08-24
              • 2022-01-08
              • 2017-12-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-12-16
              相关资源
              最近更新 更多