【问题标题】:Filling date gaps in Anorm results填补异常结果中的日期空白
【发布时间】:2014-11-06 20:07:45
【问题描述】:

我是 Scala、Play 和 Anorm 的新手,所以我想知道我该怎么做。

我有一个对我的数据库的查询,它返回一个日期,格式为DD/MM HH:OO,和一个Long,这是一个总数。

我想显示每小时的总图表,所以我创建了一个byhour 解析器:

val byhour = {
get[Option[String]]("date") ~ get[Long]("total") map {
    case date ~ total => (date, total)
}

当然,这只会返回我有数据的日期。我想用日期和总计 0 来填补日期空白,但我不知道该怎么做。

提前致谢!

编辑:我知道可以在 MySQL 中执行此操作,但我更愿意在 Scala 本身中执行此操作以保持查询干净。

【问题讨论】:

  • 你用的是什么数据库?
  • 不同的是我不想在 SQL 查询中这样做,但是在 Scala 中,所以不是同一个问题
  • 明白 - 撤回我的近距离投票。

标签: scala playframework anorm


【解决方案1】:

我认为这与 Anorm 没有直接关系,它可以让您在之后填补解析结果之间的空白。

第一个选项,您使用.as(byhour.*) 获得无序结果为List[(String, Long)],按日期排序,然后用零填充缺失日期。

SQL"...".as(byhour.*).sortBy(_._1).
  foldLeft(List.empty[(String, Long)]) {
    case (p :: l, (d, t)) =>
      (d, t) :: prefill(p, d, l)
    case (l, (d, t)) =>
      (d, t) :: l // assert l == Nil
  }.reverse

/**
 * @param p Previous/last tuple
 * @param d Current/new date
 * @param l List except `p`
 * @return List based on `l` with `p` prepended and eventually before with some filler tuple prepended.
 */
def prefill(p: (String, Long), d: String, l: List[(String, Long)]): List[(String, Long)] = ???

否则,如果您查询返回按日期排序的结果,您可以使用 Anorm 流式 API 并在发现间隙后立即填补。

// Anorm 2.3
import anorm.Success

SQL"... ORDER BY date ASC".apply().
  foldLeft(List.empty[(String, Long)]) {
    case (l, row) =>
      byhour(row) match {
        case Success((d, t)) => 
          l match {
            case p :: ts =>
              (d, t) :: prefill(p, d, l)
            case _ => (d, t) :: l
          }
        case _ => ??? // parse error
      }
  }.reverse

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2013-06-21
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多