首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用postgresql-simple将Postgres间隔转换为Haskell NominalTimeDiff

用postgresql-simple将Postgres间隔转换为Haskell NominalTimeDiff
EN

Stack Overflow用户
提问于 2015-09-04 13:07:56
回答 1查看 227关注 0票数 1

我(认为我)需要FromFieldToField实例作为NominalDiffTime,以便与具有interval类型列的Postgres表进行接口。

我已经找到了间隔 TypeInfo,并且正在研究如何与TypeInfo接口,但希望有一种更简单的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-04 20:36:44

首先,我们有理由不提供这样的例子。NominalDiffTime并不能合理地表示interval的所有值。例如,2 days不同于48 hours。特别是,1 year不能在几天内表达。

下面是一个FromField实例,用于NominalDiffTime,该实例的组件时间间隔大于一个小时(不过,大约25:00:00是可以的)。

代码语言:javascript
复制
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 Int
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32398878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档