使用slick比较java.sql.Timestamp和LocalDate?

时间:2017-10-09 11:33:13

标签: scala slick slick-3.0

我有一个光滑的列是Rep [Option [Timestamp]]。我想通过filter方法将它与用户提供的java.util.LocalDate进行比较。我只对比较日期(ddMMyyyy)感兴趣,而不是时间:

val userSuppliedLocalDate: LocalDate = ...
usersTable.filter(_.modifiedDate === userSuppliedLocalDate).result // Doesn't compile

我考虑过将Rep [Timestamp](_.modifiedDate)转换为LocalDate,但不确定这是否可行(展开Rep类型?)

或者,将userSuppliedLocalDate转换为java.sql.Timestamp并进行比较,忽略时间部分 - 这可能吗?

1 个答案:

答案 0 :(得分:2)

不推荐的方式

 Warning: Take care of time zone information

您可以将LocalDate转换为时间戳并比较时间戳。

val timestamp = Timestamp.valueOf(localDate.atStartOfDay)

您的方法变为

val userSuppliedLocalDate: LocalDate = ...
val userSuppliedTimestamp = Timestamp.valueOf(localDate.atStartOfDay)
usersTable.filter(_.modifiedDate === userSuppliedTimestamp).result

但是,这不是推荐的方式。

如果您想比较特定日期的时间戳。一个哈克就是

val start = Timestamp.valueOf(localDate.atStartOfDay())
val end = Timestamp.valueOf(start.plusDays(1))

usersTable.filter(row => row.modifiedDate >= start && row.modifiedDate < end).result

推荐的方法是将LocalDate本身用作光滑表格列。

这怎么可能?

This possible with slick column mapper.

在范围内隐含以下内容。

implicit val mapper = MappedColumnType.base[LocalDate, Timestamp](
 _.toLocalDateTime().toLocalDate(),
 Timestamp.valueOf)

现在您可以直接使用LocalDate

def birthday = column[LocalDate]("birthday")

现在你可以直接比较

def birthdaysBefore(localDate: LocalDate) = 
  query.filter(_.birthday < localDate).result

您也可以使用其他比较运算符。