我正在做一个Android应用程序,该程序生成当前日期到过去7天之间的日期的销售报告。工作正常,代码如下:
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天。当这7天分别位于两个不同的月份时,该查询将无法正常工作。我不知道发生了什么事以及如何解决它。
p.s。销售表中的date
列的类型为TEXT
。
答案 0 :(得分:1)
问题是您用于日期( dd-mm-yyyy )的格式不按字典顺序排列。字符串'25-08-2018'
比较大于'01-09-2018'
。 x BETWEEN y AND z
等同于x >= y AND x <= z
。对于使用您的格式的该范围内的日期,该条件将不成立(请记住,它们只是字符串。sqlite没有date type。
您应该使用ISO-8601格式,例如 yyyy-mm-dd 。这些将正确排序('2018-08-25' < '2018-09-01'
),并允许您在其上使用sqlite3 date and time functions。
答案 1 :(得分:0)
假设用户以这种格式输入了出生日期为31/08/2018:
像这样解析它:
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]);
}
您可以使用:p检查用户是否输入了好日期。
if( CAL_DAY > 0 && CAL_DAY < 32 && CAL_MONTH > 0 && CAL_MONTH < 13 && CAL_YEAR > 1900 )
在数据库表中存储时要特别注意:
Calendar CalendarEvent = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
CalendarEvent.set(Calendar.DATE, CAL_DAY);
CalendarEvent.set(Calendar.MONTH, CAL_MONTH - 1);
CalendarEvent.set(Calendar.HOUR_OF_DAY, Integer.parseInt(ScheduleTime) );
CalendarEvent.set(Calendar.MINUTE, 00);
CalendarEvent.set(Calendar.SECOND, 00);
SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.getDefault());
String DayConsidered = format.format(CalendarEvent.getTime());
请注意CAL_MONTH - 1
,因为系统从0到11的月份开始
在SystemTime
的数据库中存储存储,例如:
SYSTIME = CalendarEvent.getTimeInMillis();
再次使用它时,它会从数据库中检索它并像这样初始化日历事件:
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);