Android 两天之间从Sqlite数据库获取数据有困难

Android 两天之间从Sqlite数据库获取数据有困难,android,sqlite,date,android-sqlite,Android,Sqlite,Date,Android Sqlite,我在做一个Android应用程序,它可以为当前日期和过去七天之间的日期生成销售报告。工作正常,代码如下: Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_YEAR,-7); String currentDate = new SimpleDateFormat("dd-MM-yyyy").format(new Date()); SimpleDateFormat sdf = new SimpleDat

我在做一个Android应用程序,它可以为当前日期和过去七天之间的日期生成销售报告。工作正常,代码如下:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR,-7);

String currentDate = new SimpleDateFormat("dd-MM-yyyy").format(new Date());

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");

String sevenDayAgo = sdf.format(calendar.getTime());

Cursor weeklyIncome = db.getResult("select sum(price) as total_income from sales where date between '"+sevenDayAgo+"' and '"+currentDate+"'");
Cursor weeklyCost = db.getResult("select sum(purchase_price * quantity) as total_cost from sales where date between '"+sevenDayAgo+"' and '"+currentDate+"'");
比如说
currentDate=31-08-2018
sevenDayAgo=24-08-2018
这一切都很好,但是当我将系统日期更改为下个月的第二天,并且
currentDate
变为
01-09-2018
时,查询不会从数据库返回任何内容,它应该在
25-08-2018
01-09-2018
之间返回记录,这段时间间隔为七天。不知何故,当这7天是在两个不同的月份时,查询就不起作用了。我不知道发生了什么,也不知道如何解决


p、 s.销售表中的
日期
列的类型为
文本

假设用户在2018年8月31日输入了出生日期此格式:

将其解析为:

String[] parts = BirthField.getText().toString().trim().split("/");
int CAL_DAY, CAL_MONTH, CAL_YEAR;
if(parts.length == 3)
{
    CAL_DAY = Integer.parseInt(parts[0]);
    CAL_MONTH = Integer.parseInt(parts[1]);
    CAL_YEAR = Integer.parseInt(parts[2]);
}
Calendar CalendarEvent = Calendar.getInstance();
CalendarEvent.setTimeInMillis( Long.parseLong(SYSTIME) );

int CAL_DAY = CalendarEvent.get(Calendar.DAY);
CalendarEvent.set(Calendar.DATE, CAL_DAY - 7);
您可以通过以下方式检查用户是否输入了有效日期:

if( CAL_DAY > 0 && CAL_DAY < 32 && CAL_MONTH > 0 && CAL_MONTH < 13 && CAL_YEAR > 1900 )
请注意
calu MONTH-1
,因为系统从0到11个月开始

SystemTime
中将存储存储存储在数据库中时,如:

SYSTIME = CalendarEvent.getTimeInMillis();
再次使用时,请从数据库中检索并初始化日历事件,如:

String[] parts = BirthField.getText().toString().trim().split("/");
int CAL_DAY, CAL_MONTH, CAL_YEAR;
if(parts.length == 3)
{
    CAL_DAY = Integer.parseInt(parts[0]);
    CAL_MONTH = Integer.parseInt(parts[1]);
    CAL_YEAR = Integer.parseInt(parts[2]);
}
Calendar CalendarEvent = Calendar.getInstance();
CalendarEvent.setTimeInMillis( Long.parseLong(SYSTIME) );

int CAL_DAY = CalendarEvent.get(Calendar.DAY);
CalendarEvent.set(Calendar.DATE, CAL_DAY - 7);
它将开始工作,即使天/月/甚至你从任何日期更改年;它将始终显示少于7天的日期

希望它有帮助,让我知道它是如何工作的,因为我回答它很快

编辑:2

我在项目中使用的更好、最有效的方法是:

Log.d("ADDING A MONTH :", "ADDING 1 MONTH....\n");
CalendarEvent.add(Calendar.MONTH, 1);

Log.d("NEGATING 7 DAYS :", "NEGATING 7 DAYS....\n");
CalendarEvent.add(Calendar.DATE, -7);

问题是您用于日期(dd-mm-yyyy)的格式不符合字典顺序。字符串
'25-08-2018'
'01-09-2018'
x相当于
x>=y和x,您通过添加年中的日来误判;相反,你应该使用Add Debug,下面详细解释……作为一个旁白,考虑扔掉长期过时和臭名昭著的麻烦代码< SimpleDateFormat >代码>和朋友,并添加到Android项目中,以便使用<代码> java.时间>代码>,java java日期和时间API。和你一起工作真是太好了。另外,
LocalDate.toString
将为您提供例如
2018-09-01
,可以按字符串排序,因此,无需任何格式化程序即可解决您的问题。谢谢,但我没有收到用户的任何输入。我使用dd-MM-yyy格式将日期数据存储在数据库中,因此我必须使用相同的格式来检索它。你不这样认为吗?我试着在这个月加上一个,然后像你说的那样从一年中的某一天改到另一天,但它似乎不起作用是的,它起作用了。。。更新你们的代码,你们把数据放在数据库里,你们如何检索,你们如何负7天。。这3件事的完整代码感谢您的帮助,我将格式从
dd-MM-yyyy
更改为
yyy-MM-dd
,就像肖恩在另一个答案中建议的那样