房间查询|在两个字符串日期之间



我不明白为什么我的查询不起作用。我想要两次约会之间的所有商品。我过着这样的日子:";2020-05";但我总是零结果。

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

这里是我的问题:

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

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

假设日期以YYYY-MM-DD的格式存储在数据库中,那么您所使用的应该有效(不需要像ROOM那样的单引号(实际上SQLite在绑定传递的参数时会这样做(

但是,仅当dateStart和dateEnd值不同并且dateEnd的日期晚于dateStart时。

然而,如果dateStart和dateEnd相同,例如2020-05和2020-05,则它将不起作用。这是因为,例如,如果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的数据库检查器可能有用((

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

2020-05-01
2020-05-31

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+"'")

最新更新