【问题标题】:Room Query | Between two string dates房间查询 |在两个字符串日期之间
【发布时间】:2021-05-13 08:55:31
【问题描述】:

我不明白为什么我的查询不起作用。我想获得两个日期之间的所有项目。 我正在通过日期,例如:“2020-05”,但我的结果总是为零。

我做错了什么?我知道我应该有结果,但我找不到任何东西

这是我的查询:

@Query("SELECT * FROM item WHERE myDate BETWEEN :dateStart AND :dateEnd")
suspend fun getBeersByDate(dateStart: String, dateEnd: String): List<Item>

【问题讨论】:

    标签: sql android-studio android-room


    【解决方案1】:

    我做错了什么?我知道我应该有结果,但我找不到任何东西

    假设日期以 YYYY-MM-DD 格式存储在数据库中,那么您使用的应该可以工作 (不需要单引号作为 ROOM(实际上 SQLite 确实如此)当它绑定传递的参数时))

    但是,仅当 dateStart 和 dateEnd 值不同且 dateEnd 比 dateStart 晚时。

    但是,如果 dateStart 和 dateEnd 相同,例如,它将不起作用。 2020 年 5 月和 2020 年 5 月。这是因为,例如,如果 mydate 为 2020-05-01,则它大于 2020-05(因为字符串包含额外的字符)。

    • 我认为这是您的问题,即您使用 2020-05 和 2020-05 作为传递的参数。

    如果您想将 2020-05 与 2020-05(以及之后的 2020-06)一起使用,那么您可以:

    1. 需要将 2020-05-01(或当天的 00)与 2020-05-31(或当天最多 99)一起使用,因为它是字符串搜索,无效的日期无关紧要。

    2. 或仅使用 mydate 的相关部分进行搜索 即当使用 2020-05 时,前 7 个字符和示例可能是:-

    @Query("SELECT * FROM item WHERE substr(mydate,1,length(:dateStart)) BETWEEN :dateStart AND :dateEnd;")

    • 注意 dateStart 和 dateEnd 应该是相同的长度,否则这很灵活。

    @Query("SELECT * FROM item WHERE strftime('%Y-%m',mydate) BETWEEN :dateStart AND :dateEnd;")

    • 后一个选项要求根据https://sqlite.org/lang_datefunc.html(YYYY-MM-DD 是有效/公认的)将日期存储为有效/公认的日期。
    • 这不太灵活,因为参数必须采用 YYYY-MM 格式(但在能够处理以任何可识别格式存储的数据方面更加灵活)。

    如果以上不是您的问题,那么可能是由于编码问题不是问题的一部分,或者数据库中的数据未以兼容的格式存储(请注意,除非您使用日期时间函数,否则 SQLite不将存储的值视为日期,它只是数据)。

    在任何一种情况下,您的问题都没有包含足够的信息来准确说明问题所在,因此您可能希望更新您的问题(可能包括存储数据的快照( Android Studio 的 Database Inspector 可能有用))。

    【讨论】:

      【解决方案2】:

      只是一种推测,但您可以尝试传递也是有效日期文字的字符串。如果您想要 2020 年 5 月的所有数据,您可以绑定以下两个日期:

      2020-05-01
      2020-05-31
      

      【讨论】:

        【解决方案3】:

        SQL 语法很清楚,您应该将日期包含在单引号中。 现在查询类似于"... myDate BETWEEN 20/05 and 20/06",但它必须是

        "... ... myDate BETWEEN '20/05' and '20/06'"
        

        所以尝试一下:

        @Query("SELECT * FROM item WHERE myDate BETWEEN ':dateStart' AND ':dateEnd'")
        

        或者

        @Query("SELECT * FROM item WHERE myDate BETWEEN '" +dateStart+"' AND '"+dateEnd+"'")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-14
          相关资源
          最近更新 更多