如何在PostgreSQL中表示具有不确定性的日期

时间:2014-12-31 22:02:23

标签: sql database postgresql date

PostgreSQL提供date格式数据类型来存储日期。然而,这些日期的问题是 - 据我所知 - 他们不能解释不确定性。

有时人们不知道某事的完整日期,但知道它发生在1995年1月或“1999或2000”(date2)。可能有几个原因:

  • 人们不记得具体日期;
  • 确切的日期基本上是未知的:例如某个人最后一天被发现并在几天后被发现死亡;或
  • 我们处理未来事件,因此仍有可能出现问题。

我想知道是否有一种数据类型来存储这样的“日期”以及它们是如何传递的。对于某些操作,它会导致 thee-valued logic ,例如date2 < 20001/01/01应为truedate2 < 2000/01/01possible和{{1}应该是date2 < 1998/01/01

如果没有这样的数据类型,在自己构建这样的“表”有什么好的做法?

2 个答案:

答案 0 :(得分:6)

有几种不同的方法来处理模糊日期。在PostgreSQL中,您可以使用

  • 一对日期列(earliest_possible_date,latest_possible_date),
  • 日期列和精确列(&#39; 2012-01-01&#39;,&#39;年&#39;)或
  • a range data type(日期范围)或
  • a varchar(&#39; 2013-01-2?&#39;,&#39; 2013 - ?? - 05&#39;)或
  • 具有任何这些数据类型的另一个或多个表。

范围数据类型是PostgreSQL的最新版本所特有的。您可以在任何SQL dbms中使用其他SQL。

您需要的那种模糊性取决于应用程序。查询模糊日期的方式取决于您选择的数据类型或结构。您需要牢牢掌握需要存储的模糊性以及用户需要回答的问题类型。您需要进行测试以确保您的数据库能够回答他们的问题。

例如,在法律制度中,日期可能会被记住不当或污损。有人可能会说&#34;这是2014年1月的某个星期四。我知道这是星期四,因为它是垃圾收集日&#34;或者#34;这是第一次去年6月或7月的一周#34;要记录那种模糊性,你需要另一张桌子。

或邮戳可能会受到损坏,因此您只能阅读&#34; 2014年,2014年和#34;。你知道它在14号邮戳,但你不知道哪个月。同样,你需要另一张桌子。

除非你跳过一些箍,否则有些(全部?)这些都不会给你三值逻辑。 (&#34;可能&#34;不是有效的布尔值。)

答案 1 :(得分:2)

要添加Mike发布的内容,我会使用日期评论,例如:

date            Comment
-------------------------------------------------------------------
1/1/2010        Sometime in 2010
7/8/2014        Customer says they will pay the second week in July
1/1/2015        Package will arrive sometime next year in January

此外,您还可以使用日期部分。为Year,Month和Day创建单独的列。什么是未知的事情让它一片空白。