2013-11-24 42 views
4

我有這個疑問我想轉換到滑頭:如何使用簡單的數學在油滑查詢

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對我的搜索幾乎沒有任何結果,或者這很簡單,或者沒有其他人想在查詢中使用一些數學算法。

我使用油滑1.0.1在Postgres的sql

回答

1

,你可以看看到age功能的Postgres。它計算到日期之間的時間間隔。

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

+0

這個SQL確實返回完全相同的結果,我需要:SELECT(date_part數(「時代」,AVG(年齡(end_time,start_time)))* 1000):: bigint FROM v2_game;然而,仍然有* 1000,一般來說我仍然需要知道如何做數學。我有其他一些查詢,做其他類型的數學,不能使用年齡() –

+0

然後,你可能會'SimpleBinaryOperator'和'SimpleExpression'感興趣。我沒有與他們的經驗,但根據名稱和來源,他們可能會幫助你 – 1esha

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。我想這沒問題,不需要進一步進行過早的優化。 :)

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 
+0

不錯,我會去看看那個 –