模糊日期存储和搜索

时间:2012-07-28 21:56:29

标签: sql database datetime

我正在建立一个数据库来保存关于一组图片的元数据,我想要的一个字段是日期。我希望能够以粗糙或细粒度的精度存储它,例如对于数字图片,可以获得精确的时间戳到第二个,但我希望能够将图片标记为在特定的一年,甚至特定的十年中拍摄(十年是最粗糙的我' d go),也能够以这种方式搜索,例如请求来自90年代的所有图片,或1992年的所有图片或特定日子的所有图片等。

我想知道是否有一种内置的方式来使用SQL来实现这一点,或者是否有另一种更好的方法。我考虑过分开日期并分别存放每一件,例如有十年的田地,一年的田地,一个月的田地等,但这似乎可能是一种略显笨拙的做事方式。

只要它是免费的,我就不会讨论我使用的SQL技术。我现在正在看H2。

3 个答案:

答案 0 :(得分:3)

对于确切日期的模糊搜索,您不需要单独存储每个部分。您可以调整where子句。对于2012年的所有内容:

SELECT * FROM yourtable
WHERE yourtime >= '2012-01-01' AND yourtime < '2013-01-01'

如果您想要特定的一天:

SELECT * FROM yourtable
WHERE yourtime >= '2012-07-28' AND yourtime < '2012-07-29'

或特定时间:

SELECT * FROM yourtable
WHERE yourtime >= '2012-07-28 13:00:00' AND yourtime < '2012-07-28 14:00:00'

要使所有这些查询更有效,您可以为时间戳列添加索引。


关于如何存储模糊日期,一个选项是拥有一系列日期:

id    taken_from            taken_to               title
1     2011-01-01 00:00:00   2012-01-01 00:00:00    a pic of my car last year

对于模糊日期的模糊搜索,您可以执行以下操作:

fuzzy date search

在伪SQL中:

SELECT
    *,
    (LEAST(@to, taken_to) - GREATEST(@from, taken_from)) /
    (GREATEST(@to - taken_to) - LEAST(@from, taken_from)) AS relevancy
FROM yourtable
WHERE taken_to >= @from AND taken_from < @to

您可能希望按相关性排序,并且您可能希望包含其他因素,例如某些搜索字词的全文搜索返回的相关性。

答案 1 :(得分:2)

只需两列即可完成此操作:一列用于时间戳,另一列用于精度级别。然后,您必须定义精度标度,并在时间戳上编码较低精度日期的标准。

例如,精度标度可以是:

0   full timestamp
1   day
2   month
3   year
4   decade

有了这个,您可以存储这样的日期:

timestamp                 |  precision   | notes
--------------------------+--------------+---------------------
2012-07-05 14:00:00       |  0           | full precision
--------------------------+--------------+---------------------
2012-07-05 00:00:00       |  1           | precision up to day
--------------------------+--------------+---------------------
2012-07-01 00:00:00       |  2           | month and year
--------------------------+--------------+---------------------
2012-01-01 00:00:00       |  3           | year
--------------------------+--------------+---------------------
2010-01-01 00:00:00       |  4           | decade
--------------------------+--------------+---------------------

答案 2 :(得分:1)

我过去使用过CHAR和VARCHAR,用问号或破折号代替缺失的部分。问号意味着“未知”,破折号意味着“不适用”。事实证明这对于用户(复杂诉讼中的秘书和律师助理)来说足够直观,对律师来说足够灵活,并且可以合理地进行分类。

表示您的“日期”不再是SQL日期。也就是说,日期/时间算术和间隔兼容性在它完全起作用时不那么健壮。 (什么是“20世纪60年代加20天?”这是一个更长的十年,还是一个转移的十年?)这是否重要依赖于应用程序。我不认为这对你的申请来说是一个问题。

详情和注意事项在dba.stackexchange.com