2014-12-31 28 views
6

PostgreSQL提供date格式數據類型來存儲日期。然而,這些日期的問題是,他們不能 - 據我所知 - 有關不確定性的原因。如何在PostgreSQL中表示具有不確定性的日期

有時一個人不知道東西的全部日期,但知道它發生在1995年1月或在「1999年或2000年」(date2)。可能有幾個原因:

  • 人們不記得確切的日期;
  • 確切的日期基本上是未知的:例如某人最近一次在某天看到並在幾天後發現死亡;或
  • 我們處理未來的事件,所以仍然有一些機會出現問題。

我想知道是否有一個數據類型來存儲這樣的「日期」,以及他們如何交付。對於一些操作,例如date2 < 20001/01/01應該是true,date2 < 2000/01/01possibledate2 < 1998/01/01應該是false,這將導致這樣的值邏輯

如果沒有這樣的數據類型可用,有什麼好的做法來構建這樣的「表」呢?

+4

您可以將這些日期存儲爲對,第一次約會和最後一次約會,然後在時間段使用Postgres功能,例如'overlaps'。 –

回答

5

處理模糊日期有幾種不同的方法。在PostgreSQL,你可以使用

  • 一對日期列(earliest_possible_date,latest_possible_date)的,
  • 日期列和精密柱( '2012-01-01', '年'),或
  • 一個range data type(日期範圍),或
  • 一個varchar( '2013年1月2日?', '2013 - ?? - 05'),或
  • 另一個或多個表與任何這些數據類型的。

範圍數據類型是最新版本的PostgreSQL特有的。你可以在任何SQL dbms中使用其他的。

您需要的模糊程度取決於應用程序。如何查詢模糊日期取決於您選擇哪種數據類型或結構。您需要牢牢掌握您需要存儲的模糊程度以及用戶需要回答的問題類型。你需要測試以確保你的數據庫能夠回答他們的問題。

例如,在法律制度中,日期可能會被記住不佳或污損。有人可能會說:「這是2014年1月的某個星期四。我知道這是一個星期四,因爲它是垃圾回收日」,或「這是去年六月或七月的第一週」。要記錄這種模糊性,你需要另一張桌子。

或者郵戳可能會損壞,因此您只能閱讀「14,2014」。你知道這是14號郵戳,但你不知道哪個月。再一次,你需要另一張桌子。

有些(所有?)這些將不會給你三值邏輯,除非你跳過一些籃球。 (「可能」不是有效的布爾值。)

+0

我還可以使用'hstore'列的圖片,在其中使用「精度」作爲關鍵字:'date_col - >'year''或'date_col - >'quarter''。可能比帶佔位符的varchar更靈活。 –

+0

@a_horse_with_no_name:好點。 JSON和數組類型也是可能的。即使XML可以工作。所有這些需要更多的程序代碼來排除不良數據。 (我很高興我不需要像以前那樣處理模糊的日期。) –

2

爲了增加邁克貼,我會用最新的意見,例如:

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創建一個單獨的列。什麼都不知道讓它變成空白。

相關問題