strftime('%m',date)仅在2个月内返回错误的月份值

问题描述 投票:0回答:1

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

我正在使用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是行不通的,并且我想确保它计算开始和结束月份的所有记录,而不考虑时间戳。

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

我如何使该查询中的任何一个起作用?

提前感谢。

编辑1:我解决了部分问题,我的错误是我正在使用数据类型错误的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:帖子很长,因此我正在编辑,仅保留相关信息以及对我有用的内容,以防它对其他人有帮助:我使用了已接受答案的建议提示(用date()包装日期)和将结束日期限制部分再次更改为AND date<= :end_date

java android android-sqlite android-room mpandroidchart
1个回答
1
投票

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

我建议:

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

或更佳

  1. TypeConverter中使用TypeConverter,并以Room之类的格式存储日期,并将其用于比较。
© www.soinside.com 2019 - 2024. All rights reserved.