我在一个安卓应用程序上有四个按钮。每个按钮查询一个SQLite数据库并根据日期抓取记录。(按钮为'Today', 'Week', 'Month', 'All')
日期在我的表中存储为DATETIME,我也用日期查询它。一切都很好,直到我把上个月之前完成的所有工作都抓起来。
今天是2016年6月29日
我在2016年6月16日在我的SQLite数据库中创建了一个条目,并成功存储。我在2016年6月27日创建了另一个条目,并成功存储。
现在我按下'Today'按钮并返回0条记录。(正确)
我按下周键并返回1条记录(正确-创建于6月27日)
我按下月份按钮并返回0条记录。(不正确的。我应该得到2条记录)
这是我对数据库使用的查询:
String queryString = "SELECT * FROM job_quote_lookup WHERE created_at >= '" + date + "' ORDER BY created_at ASC"
'date'的计算方法如下:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -31);
Date fromDate = cal.getTime();
date = dateFormat.format(fromDate);
(31表示一个月内可能的最大天数)
似乎当日期向后一个月时,问题就出现了。如果我删除20天而不是31天,那么日期将是"6月9日",我将收到我应该收到的两份记录。但如果日期进入5月,我将收到0条记录。
我尝试过的其他查询字符串
String queryString = "SELECT * FROM job_quote_lookup WHERE created_at >= date('now','-31 days') ORDER BY created_at ASC"
这似乎不工作?
我还是Android的新手,所以如果这是一个糟糕的问题,我很抱歉。我用谷歌搜索了一下,但没有找到任何可能有帮助的东西。
UPDATE: Extra Info
下面是一些可能更有帮助的附加代码
用于在我的SQLite中标记时间条目的dateFormat是:
private String getDateTime() {
SimpleDateFormat dateFormat = new SimpleDateFormat(
"dd/MM/yyyy - HH:mm", Locale.getDefault()); //"yyyy-MM-dd HH:mm:ss" - "dd-MM-yyyy HH:mm:ss"
Date date = new Date();
return dateFormat.format(date);
}
当我查询数据库时使用的日期格式是:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
我不确定这是否正确,但是我离开"HH:mm"的理由是由于"Today"选项不能正常工作,因为它会返回比当前时间大的所有内容(显然在时间戳方面没有任何内容)
无法解决…最后将我的数据库DATETIME转换为INTEGER并以毫秒为单位存储日期,然后在日期格式和毫秒之间转换以查询和显示信息
如果您想更改Java Calendar
对象的月份,您将需要使用:
cal.add(Calendar.MONTH, -1);
,上面的代码片段将把月份回滚1。例如,如果您在2月15日调用cal.add(Calendar.DATE, -31)
,您会得到一个奇怪的结果,因为月份不会改变,但日期会转过去。
更新:
你还必须确保你输入MySQL的日期格式是正确的。MySQL希望日期格式为YYYY-MM-DD
,所以使用如下:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(cal.getTime());
如果您希望使用复杂的日历操作,我建议使用JodaTime。