我有这个想要转换为光滑的查询:
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
答案 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。我想这没关系,不需要进一步优化过早优化。 :)