Android 两天之间从Sqlite数据库获取数据有困难
我在做一个Android应用程序,它可以为当前日期和过去七天之间的日期生成销售报告。工作正常,代码如下: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
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>=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
,就像肖恩在另一个答案中建议的那样