代码:
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]。我需要有关在结果之上应用日期范围过滤器的帮助。
答案 0 :(得分:1)
isBefore
和isAfter
不起作用。您必须使用<
,<=
和>
,>=
。
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 来提及导致我不正确结果的月份。现在我在改变后得到了适当的结果。