2012-07-28 71 views
2

我希望做一个数据库来保存有关一组图片和一个领域我想是日期拍摄的元数据。我希望能够以粗糙或细粒度的精度来存储它,例如,对于数字图片的确切时间标记精确到秒将可用,但我希望能够标记照片刚刚被采取在特定年份,或者是特定十年(十年是最粗的我” d go),并且还能够以这种方式进行搜索,请求例如来自90年代的所有图片,或来自1992年的所有图片或来自特定日子的所有图片等。模糊日期存储和搜索

我想知道是否有建成用SQL来做这件事,或者如果有另一种更好的方法。我想打破日期并分开存放每件作品,例如有一个十年的领域,一年的领域,一个月的领域等,但这似乎可能是一个稍微笨拙的做事方式。

我不是大惊小怪我只要它是免费使用的SQL技术。我现在正在看H2。

回答

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 
--------------------------+--------------+--------------------- 
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

In伪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 

你可能想通过相关命令,你可能要包括其他因素,如通过全文搜索某些字词返回的相关性。

+0

这种方法适用于如果你知道什么时候被拍摄的照片进行搜索,但有可能存储与只用了一年的日期,或仅短短十年?我可能有我认为是在20世纪20年代拍摄的照片,但我不能说比这更准确,而且我不想将它们存储为1920年1月1日拍摄,如果这不准确 – user1111284 2012-07-28 22:02:51

+0

@ user1111284:嗯......你可以存储一系列的日期,在这些日期你认为照片可能被拍摄,例如'从' - '到'。但是,如果您在2012年拍摄了一段时间的照片并且您的搜索是“2012年6月的所有照片”,那么会发生什么?该照片是否应该包含在搜索中?它*可能在六月份被采纳,但最有可能的不是。也许你可以根据照片范围和搜索范围之间的重叠百分比进行排序。 – 2012-07-28 22:07:20

+0

是的,我不确定是否要包含这些项目。也许让他们在明确结果下面的一个单独列表中,按照准确性排序。 – user1111284 2012-07-28 22:08:54