我正在建立一个数据库来保存关于一组图片的元数据,我想要的一个字段是日期。我希望能够以粗糙或细粒度的精度存储它,例如对于数字图片,可以获得精确的时间戳到第二个,但我希望能够将图片标记为在特定的一年,甚至特定的十年中拍摄(十年是最粗糙的我' d go),也能够以这种方式搜索,例如请求来自90年代的所有图片,或1992年的所有图片或特定日子的所有图片等。
我想知道是否有一种内置的方式来使用SQL来实现这一点,或者是否有另一种更好的方法。我考虑过分开日期并分别存放每一件,例如有十年的田地,一年的田地,一个月的田地等,但这似乎可能是一种略显笨拙的做事方式。
只要它是免费的,我就不会讨论我使用的SQL技术。我现在正在看H2。
答案 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
对于模糊日期的模糊搜索,您可以执行以下操作:
在伪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