2014-11-24 20 views
4

在編寫接受來自用戶的tsrange文字的程序,然後插入各種SQL查詢的過程中,今天我正在測試一些tsrange以瞭解它們是如何被PostgreSQL 9.3.5解釋的。PostgreSQL tsrange:它是正確的lower_inf('( - 無窮,今天)':: tsrange)爲假?

這其中,尤其是行爲異常: '(-infinity今天)' :: tsrange

的lower_inf功能說下界是不是無限

test=> SELECT lower_inf('(-infinity,today)'::tsrange); 
lower_inf 
----------- 
f 
(1 row) 

然而,PostgreSQL的(!)報告這個tsrange包含一個像'1000-01-01 BC'這樣的時間戳。 。 。

test=> SELECT '(-infinity,today)'::tsrange @> '1000-01-01 BC'::timestamp; 
?column? 
---------- 
t 
(1 row) 

任何人都可以闡明這一點嗎?

+1

看起來很可疑的bug報告證明給我。 – 2014-11-24 12:22:36

+0

@CraigRinger:起初我也這麼認爲。但事實證明,這是有記錄的。更像是一個不幸的雙重使用術語「無窮大」。 – 2014-11-24 15:29:54

回答

6

這裏的混淆源於兩個不同含義的「無窮大」

  1. timestamp類型接受special values for infinity and -infinity
  2. 範圍類型對於沒有下限/上限的範圍具有一般概念。測試它的函數被稱爲lower_inf() and upper_inf(),但它們實際上測試範圍中的「沒有界限」。範圍沒有上限/下限包括infinity /對timestamp-infinity分別。

Per documentation:

此外,一些元素類型具有「無限」的概念,但是這僅僅是 另一個值爲止的範圍類型的機制有關。例如,對於 示例,在時間戳範圍內,[today,]的含義與 [today,)的含義相同。但[today,infinity]意味着不同於 [today,infinity) - 後者排除了特殊時間戳值infinity

SQL Fiddle.

也許這些功能的確可以稱爲像lower_nobound()upper_nobound(),以避免混淆...

+0

很好地抓住並很好地解釋。我應該已經意識到這是發生了什麼,但是首先沒有RTFM。 – 2014-11-24 15:24:29

+0

事實上,我在文檔中閱讀了這段代碼,但並不明白「無窮大隻是另一個值」與區間是無界的不同。無限如何才能成爲「僅僅是另一個價值」,[今天,無限]如何與[今天,無限]不同? – smithfarm 2014-11-24 15:38:58

+0

@smithfarm:答案在文檔中引用。 – 2014-11-24 16:04:20