【问题标题】:Comparing java.sql.Timestamp and LocalDate using slick?使用 slick 比较 java.sql.Timestamp 和 LocalDate?
【发布时间】:2017-10-09 11:33:12
【问题描述】:

我有一个 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 并忽略时间部分进行比较 - 这可能吗?

【问题讨论】:

    标签: scala slick slick-3.0


    【解决方案1】:

    不推荐的方式

     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
    

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

    【讨论】:

    • 对于'不推荐的方式',我想忽略时代,这可能吗? (我只想比较日期)
    • 谢谢,_.modifiedDate 怎么样 - 我们是否也需要将其更改为 atStartOfDay(否则时间可能会不同?)。虽然不确定我可以通过过滤功能修改它
    • @Rory 在答案中添加了更多内容。请检查
    猜你喜欢
    • 2021-05-03
    • 2017-10-08
    • 1970-01-01
    • 2020-12-20
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多