需要帮助比较DateTime到Slick

时间:2016-10-17 09:35:12

标签: scala slick-3.0

代码:

 def getDatasetStats(startDate: DateTime, endDate: DateTime) = {
    val query = for(created <- datasets) yield created.createdOn
    db.run(query.filter(d => d >= startDate && d <= endDate).size.result)   
  }

表:

protected class Datasets(tag: Tag) extends Table[SqlDataset](tag, "datasets") {
    // format: OFF
    def id = column[UUID]("id", O.PrimaryKey)

    def name = column[String]("name")

    def createdOn = column[DateTime]("created_on")

    def updatedOn = column[Option[DateTime]]("updated_on")

    def isPublic = column[Boolean]("public")

    def * = (id, name, createdOn, isPublic, updatedOn) <>
      ((SqlDataset.apply _).tupled, SqlDataset.unapply)

    implicit def jodaTimeMapping: BaseColumnType[DateTime] = MappedColumnType.base[DateTime, Timestamp](
      dateTime => new Timestamp(dateTime.getMillis),
      timeStamp => new DateTime(timeStamp.getTime)
    )

    // format: ON
  }

我尝试的上述解决方案无法正常工作。此外,我无法使用isBefore或isAfter,因为我从DB获取Rep [DateTime]。我需要有关在结果之上应用日期范围过滤器的帮助。

2 个答案:

答案 0 :(得分:1)

isBeforeisAfter不起作用。您必须使用<<=>>=

Slick建立在JDBC之上。 JDBC仅了解java.sql.Timestamp。因此,为joda implicit提供DateTime映射列类型。

 implicit def jodaTimeMapping: BaseColumnType[DateTime] = MappedColumnType.base[DateTime, Timestamp](
    dateTime => new Timestamp(dateTime.getMillis),
    timeStamp => new DateTime(timeStamp.getTime)
  )

现在您可以使用<<=>>=

>相当于isAfter,<相当于isBefore。

在您处理implicit 的范围内DateTime

protected class Datasets(tag: Tag) extends Table[SqlDataset](tag, "datasets") {

implicit def jodaTimeMapping: BaseColumnType[DateTime] = MappedColumnType.base[DateTime, Timestamp](
      dateTime => new Timestamp(dateTime.getMillis),
      timeStamp => new DateTime(timeStamp.getTime)
    )

def id = column[UUID]("id", O.PrimaryKey)

def name = column[String]("name")

def createdOn = column[DateTime]("created_on")

def updatedOn = column[Option[DateTime]]("updated_on")

def isPublic = column[Boolean]("public")

def * = (id, name, createdOn, isPublic, updatedOn) <>
  ((SqlDataset.apply _).tupled, SqlDataset.unapply)

}

方法

def getDatasetStats(startDate: DateTime, endDate: DateTime) = {

implicit def jodaTimeMapping: BaseColumnType[DateTime] = MappedColumnType.base[DateTime, Timestamp](
          dateTime => new Timestamp(dateTime.getMillis),
          timeStamp => new DateTime(timeStamp.getTime)
        )

  db.run(datasets.map(_.createdOn).filter(d => d >= startDate && d <= endDate).size.result)   
}

答案 1 :(得分:0)

我的坏。我尝试过的解决方案实际上有效。问题在于我用来将字符串转换为DateTime的模式转换。

有问题的代码:

 val dtf = JDateTimeFormat.forPattern("yyyymmdd") 

修改:

 val dtf = JDateTimeFormat.forPattern("yyyyMMdd")

mm - &gt; miniutes

MM - &gt;月

由于我在小写字母中使用 mm 来提及导致我不正确结果的月份。现在我在改变后得到了适当的结果。