2012-07-28 45 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