我(认为我)需要FromField和ToField实例作为NominalDiffTime,以便与具有interval类型列的Postgres表进行接口。
我已经找到了间隔 TypeInfo,并且正在研究如何与TypeInfo接口,但希望有一种更简单的方法?
发布于 2015-09-04 20:36:44
首先,我们有理由不提供这样的例子。NominalDiffTime并不能合理地表示interval的所有值。例如,2 days不同于48 hours。特别是,1 year不能在几天内表达。
下面是一个FromField实例,用于NominalDiffTime,该实例的组件时间间隔大于一个小时(不过,大约25:00:00是可以的)。
instance FromField NominalDiffTime where
fromField f mdat =
if typeOid f /= typoid interval
then returnError Incompatible f ""
else case mdat of
Nothing -> returnError UnexpectedNull f ""
Just dat -> case parseOnly (nominalDiffTime <* endOfInput) dat of
Left msg -> returnError ConversionFailed f msg
Right t -> return t
nominalDiffTime :: Parser NominalDiffTime
nominalDiffTime = do
(h, m, s) <- interval
return . fromRational . toRational $ s + 60*(fromIntegral m) + 60*60*(fromIntegral h)
-- | Parse a limited postgres interval of the form [-]HHH:MM:SS.[SSSS] (no larger units than hours).
interval :: Parser (Int, Int, Pico)
interval = do
h <- signed decimal <* char ':'
m <- twoDigits <* char ':'
s <- seconds
if m < 60 && s <= 60
then return (h, m, s)
else fail "invalid interval"
-- functions below borrowed from postgresql-simple
seconds :: Parser Pico
twoDigits :: Parser Inthttps://stackoverflow.com/questions/32398878
复制相似问题