两天之间很难从Sqlite数据库获取数据

时间:2018-08-31 14:02:40

标签: android sqlite date android-sqlite

我正在做一个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-2018sevenDayAgo = 24-08-2018都可以正常工作,但是当我将系统日期更改为下个月的第二天,并且currentDate变成01-09-2018时,查询不会从数据库返回任何信息,它应该返回25-08-201801-09-2018之间的记录,该记录之间的间隔为7天。当这7天分别位于两个不同的月份时,该查询将无法正常工作。我不知道发生了什么事以及如何解决它。

p.s。销售表中的date列的类型为TEXT

2 个答案:

答案 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);