strftime('%m',date) returns 错误的月份值只有 2 个月

strftime('%m',date) returns wrong month value only for 2 months

我一直在寻找一些答案,但我仍然对这个问题感到困惑。

我正在使用 Room 并且我有一个数据库,我在其中存储具有以下格式的日期: 'YYYY-MM-DDTHH:MM:SS.sss',因为我使用 LocalDateTime.now() 创建它们。

我正在尝试执行查询以获取日期介于 start_date 和 end_date 之间的项目,两者的格式均为 'YYYY-MM-DD'。我正在从 DatePickerDialog 获取值,所以没有附加时间。

我尝试了这两个查询,都给出了错误的结果:

@Query("SELECT strftime('%m-%Y',date) as month, COUNT(*) as total from items 
WHERE date>= :start_date AND date< :end_date GROUP BY strftime('%m-%Y',date)")

LiveData<List<Result>> getResult(String start_date, String end_date);
@Query("SELECT strftime('%m',date) as month, COUNT(*) as total from items 
WHERE date>= :start_date AND date< :end_date GROUP BY strftime('%m',date)")

LiveData<List<Result>> getResult(String start_date, String end_date);

现在我可以通过两个查询(例如“02”或“02-2020”)正确获得月份数,但不能获得总数。问题是它仍然不计算 item_date=end_date 的项目。将查询部分从 AND date< :end_date 更改为 AND date<= :end_date 不起作用,我想确保它计算开始和结束月份的所有记录,而不考虑时间戳。

我想统计 select 日期内每个月的项目数。为简单起见,我只让用户选择去年的 select 个日期(例如,从 7 月到 6 月)。我要获取的 2 个值是月份数 (1-12) 和该月的项目总数。

我怎样才能让这个查询起作用?

提前致谢。

EDIT1:我解决了部分问题,我的错误是我使用了错误数据类型的 POJO(我使用 int 来获取 strftime("%m-%Y", date) 部分) .通过将其更改为以下解决:

public class Tuple{

    @ColumnInfo(name="month")
    private String Date; // my mistake was here, had int instead of String
....

}

EDIT2:post 很长,所以我编辑只留下相关信息加上对我有用的信息,以防对其他人有帮助:我使用了已接受答案的建议提示(包装日期 date()) 并再次将结束日期限制部分更改为 AND date<= :end_date

sqlite 没有 DateTime 数据类型。所以您将日期存储为字符串。您还使用 Date 字符串(通过与 DateTime 字符串进行比较)在查询中进行过滤。对于查询日期参数,您使用 YYYY-MM-DD 格式,而对于存储,您使用 YYYY-MM-DD hh:mm:ss。这是一个字符串比较,这种不一致的比较可能会产生意想不到的结果。

我会推荐:

  1. 您在 sqlite 中使用 date() 以遵循一致的日期格式来比较日期字符串。

或更好

  1. Room 中使用 TypeConverter 并以类似 long 的格式存储日期并使用它进行比较。