【问题标题】:How to use simple math in Slick Queries如何在 Slick Queries 中使用简单的数学运算
【发布时间】:2013-11-24 15:30:10
【问题描述】:

我想将这个查询转换为 slick:

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

我可以忍受发生在 scala 而不是数据库中的演员表,但我不知道如何做减法。 end_time 和 start_time 都是日期,在数据库中表示为时间戳。到目前为止,我有这个:

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

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

我正在使用带有 postgres sql 的 Slick 1.0.1

【问题讨论】:

    标签: sql scala slick


    【解决方案1】:

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

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

    【讨论】:

    • 这个 sql 确实返回了我需要的完全相同的结果: SELECT (date_part('epoch', AVG(age(end_time, start_time)))*1000)::bigint FROM v2_game;但是仍然有 *1000 并且通常我仍然需要知道如何做数学。我有很多其他查询可以做其他类型的数学,不能使用 age()
    • 那么您可能对SimpleBinaryOperatorSimpleExpression 感兴趣。我对他们没有经验,但根据名称和来源,他们可能会对您有所帮助
    【解决方案2】:

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

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

    相当于

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

    【讨论】:

      【解决方案3】:

      所以似乎有一些扩展可以做数学: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。我想这没关系,无需进一步进行过早的优化。 :)

      【讨论】:

        猜你喜欢
        • 2020-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多