2016-04-14 109 views
1

我知道此問題已在past before中提出,現在標記爲已解決。在Postgresql中檢索帶時區的時間戳 - 簡單

我正在使用postgresql-simple包和Data.Time。如果我進行查詢以檢索timestamptz類型的單個列,則會發生模式匹配錯誤。下面的僞代碼:

import Data.Text as T 
import Data.Time (UTCTime,LocalTime,ZonedTime) 
import Database.PostgreSQL.Simple as Pg 
import Database.PostgreSQL.Simple.FromRow 
import Database.PostgreSQL.Simple.ToRow 
import Database.PostgreSQL.Simple.ToField 
import Database.PostgreSQL.Simple.Time 
import qualified Data.Vector as V 
... 
--- in main this is the code 
[Pg.Only (i::UTCTime)] <- Pg.query conn "select lastupdated from constraints where name=?" (Only ("carrier"::T.Text)) 
... 

執行查詢時,我在運行時出現此錯誤(請注意上面:

*** Exception: user error (Pattern match failure in do expression at ...) 

如果我上面更改爲無效類型象下面這樣:

[Pg.Only (i::T.Text)] <- Pg.query conn "select lastupdated from constraints where name=?" (Only ("carrier"::T.Text)) 

我收到的例外情況顯示預期類型的​​確是timestamptz

*** Exception: Incompatible {errSQLType = "timestamptz",..., 
errSQLField = "lastupdated", errHaskellType = "Text", errMessage = "types incompatible"} 

此外,這是上面的查詢結果如何看起來psql控制檯:

  lastupdated   
------------------------------- 
2016-04-13 00:08:33.789761+00 
2016-04-13 14:33:38.27739+00 
(2 rows) 

我的理解是,Data.Time.UTCTimeDatabase.PostgreSQL.Simple.Time.UTCTimestamp應該映射到timestamptz類型的PostgreSQL。顯然,如果我得到上述錯誤,那麼這種理解就是錯誤的。將欣賞這個幫助。

回答

2

試試這個:

(times :: [Pg.Only UTCTime]) <- 
    Pg.query conn "select lastupdated from constraints where name=?" (Only ("carrier" :: T.Text)) 

你的模式匹配不僅強制執行,有希望成爲Only UTCTime個列表,但也有會在列表中的一個要素。由於您有兩條記錄,因此query將返回包含兩個元素的列表,並且模式匹配失敗。

+0

已解決,謝謝! – Sal

相關問題