使用 slick 比较 java.sql.Timestamp 和 LocalDate?
Comparing java.sql.Timestamp and LocalDate using slick?
我有一个漂亮的列,它是 Rep[Option[Timestamp]]。我想将它与通过过滤器方法提供的 java.util.LocalDate 的用户进行比较。我只对比较日期 (ddMMyyyy) 感兴趣,而不是时间:
val userSuppliedLocalDate: LocalDate = ...
usersTable.filter(_.modifiedDate === userSuppliedLocalDate).result // Doesn't compile
我考虑过将 Rep[Timestamp] (_.modifiedDate) 转换为 LocalDate,但不确定这是否可行(展开 Rep 类型?)
或者,将 userSuppliedLocalDate 转换为 java.sql.Timestamp 并进行忽略时间部分的比较 - 这可能吗?
不推荐的方式
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
但是,这不是推荐的方式。
如果你想比较特定日期的时间戳。一个 Hack 是
val start = Timestamp.valueOf(localDate.atStartOfDay())
val end = Timestamp.valueOf(start.plusDays(1))
usersTable.filter(row => row.modifiedDate >= start && row.modifiedDate < end).result
推荐的方法是使用 LocalDate
本身作为光滑的 table 列。
这怎么可能?
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
您也可以使用其他比较运算符。
我有一个漂亮的列,它是 Rep[Option[Timestamp]]。我想将它与通过过滤器方法提供的 java.util.LocalDate 的用户进行比较。我只对比较日期 (ddMMyyyy) 感兴趣,而不是时间:
val userSuppliedLocalDate: LocalDate = ...
usersTable.filter(_.modifiedDate === userSuppliedLocalDate).result // Doesn't compile
我考虑过将 Rep[Timestamp] (_.modifiedDate) 转换为 LocalDate,但不确定这是否可行(展开 Rep 类型?)
或者,将 userSuppliedLocalDate 转换为 java.sql.Timestamp 并进行忽略时间部分的比较 - 这可能吗?
不推荐的方式
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
但是,这不是推荐的方式。
如果你想比较特定日期的时间戳。一个 Hack 是
val start = Timestamp.valueOf(localDate.atStartOfDay())
val end = Timestamp.valueOf(start.plusDays(1))
usersTable.filter(row => row.modifiedDate >= start && row.modifiedDate < end).result
推荐的方法是使用 LocalDate
本身作为光滑的 table 列。
这怎么可能?
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
您也可以使用其他比较运算符。