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
。这是一个字符串比较,这种不一致的比较可能会产生意想不到的结果。
我会推荐:
- 您在 sqlite 中使用
date()
以遵循一致的日期格式来比较日期字符串。
或更好
- 在
Room
中使用 TypeConverter
并以类似 long
的格式存储日期并使用它进行比较。
我一直在寻找一些答案,但我仍然对这个问题感到困惑。
我正在使用 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
。这是一个字符串比较,这种不一致的比较可能会产生意想不到的结果。
我会推荐:
- 您在 sqlite 中使用
date()
以遵循一致的日期格式来比较日期字符串。
或更好
- 在
Room
中使用TypeConverter
并以类似long
的格式存储日期并使用它进行比较。