SQLite3中的日期,有一个扭曲(不准确的日期)

时间:2013-04-15 23:50:49

标签: sqlite database-schema

我正在研究以SQLite3格式存储数据的系谱软件。一切都很好,除了一个小细节。并非在所有情况下都是确切日可用的出生日期(等)的准确性。所以我有以下准确性:

  • exact(YYYY-MM-DD)
  • 月(YYYY-MM)
  • 年(YYYY)
  • 年(YYYY +/- 5)
  • 年(YYYY +/- 10)
  • 年(YYYY +/- 50)
  • 十年
  • 世纪

现在,假设我将所有内容存储在一个列中,我最终遇到了问题。由于SQLite3有Julian Day function,我想在REAL朱利安日的小数部分编码精确度(我不需要时间)。这很好,但它使SELECT的工作方式变得复杂,事实上它意味着我可以以其他方式卸载到SQLite3的东西必须在应用程序代码中实现。

存储不准确日期能够快速查询的合理方法是什么?

注意:如果对任何回答都很重要,那么使用的语言是Python,但我一般都会问。

3 个答案:

答案 0 :(得分:1)

对这些日期值进行查询时,最常见的操作可能是检查日期是否与另一个日期匹配。 为此,您始终需要间隔的开始和结束,因此将这两个值存储在DB中是有意义的。 (称他们为Start / EndMin / MaxEarliest / Latest或任何有意义的。)

例如,找一个可能在一个世纪前出生的人:

... WHERE '1913-04-16' BETWEEN BirthDateMin AND BirthDateMax

可以使用其中一个区间边界进行不等式比较。 例如,要找到可能在一个多世纪前出生的人:

... WHERE BirthDateMin < '1913-04-16'

答案 1 :(得分:0)

仅仅因为您存储日期信息,并不意味着内置日期类型适合您。您的数据要求(日期不准确)意味着进行一些自定义日期处理工作可能更准确,更长远,并避免使用内置日期数据类型。

答案 2 :(得分:0)

使用两列。一列是SQLite格式的尽可能准确的近似日期。第二列是以天为单位的日期的准确性。如果日期绝对准确,则第二列为零。如果仅知道月份,则日期为月中,第二列为15天。等等。日期比较可以通过与日期+/-准确度列进行比较来完成。