如何在Slick Queries中使用简单数学

时间:2013-11-24 15:30:10

标签: sql scala slick

我有这个想要转换为光滑的查询:

SELECT (date_part('epoch', SUM(end_time - start_time))*1000)::bigint FROM v2_game

我可以忍受在scala而不是在数据库中发生的演员,但我对如何进行减法感到茫然。 end_time和start_time都是Dates,表示为数据库中的时间戳。到目前为止,我有这个:

val datePart = SimpleFunction.binary[String, Date, Double]("date_part")
  val q = for {
    g <- Games
  } yield datePart("epoch", g.startTime)

那么如何减去/添加值呢? Google在我的搜索中几乎没有返回任何结果,要么这非常简单,要么没有其他人想在查询中使用一些数学。

我正在使用Slick 1.0.1和postgres sql

3 个答案:

答案 0 :(得分:1)

您可以在postgres中查看age函数。它计算日期之间的间隔。

http://www.postgresql.org/docs/9.3/static/functions-datetime.html

答案 1 :(得分:1)

查看slick-pg library。它具有光滑的扩展,以支持postgres特定的东西,包括日期/时间操作。如果你添加DateTime support,你可以写,例如

val q = for {
  g <- Games
} yield (g.endTime - g.startTime).part("epoch")

这相当于

SELECT date_part('epoch', endTime - startTime) FROM games

答案 2 :(得分:0)

所以似乎有数学扩展:http://slick.typesafe.com/doc/1.0.1/api/index.html#scala.slick.lifted.NumericColumnExtensionMethods

然而,这些似乎不适用于日期,并且还要求所涉及的值具有完全相同的类型。所以有了这些知识,我现在使用年龄函数,感谢1esha,最后得到了这个:

  val datePartLong = SimpleFunction.binary[String, Date, Long]("date_part")
  val age = SimpleFunction.binary[Date, Date, Date]("age")

  val q = Query((for {
    g <- Games
  } yield datePartLong("epoch", age(g.endTime, g.startTime)) * 1000L).sum)

一个小小的警告是,这会在每一行上调用date_part方法并在之后进行求和,但是我找不到相反的方法来执行此操作,它根本无法按类型进行操作。 根据解释,对于光滑查询,查询成本为164,对于纯sql,查询成本为139。我想这没关系,不需要进一步优化过早优化。 :)