我有一个按日期排序的不同交易的数据库:
第1列:交易金额
第2列:日期(以毫秒为单位)
我想要汇总特定月份的所有交易。例如:2015年1月。我的问题与这篇文章相同:Sum over values by month in milliseconds但我没有到达以使其适应我的问题,而且我的声誉也不允许我与帖子进行互动。
这是我的代码:
public int getIncomeOfMonth(int monthnumber) {
int year = Calendar.getInstance().get(Calendar.YEAR);
Cursor cursorIncome = db.rawQuery(
"SELECT sum(amount) FROM " + MyDbTable +
" WHERE " + " strftime('%" + year + "-%" + monthnumber + ", " + COLUMN_DATE + "/ 1000, 'unixepoch') ", null);
int positiveTransacSelectedMonth = 0;
if(cursorPositiveTransac.moveToFirst()) {
positiveTransacSelectedMonth = (cursorPositiveTransac.getDouble(0));
}
return positiveTransacSelectedMonth;
}
我已经阅读了Sqlite网站上的文档,但无法找到理解方法。你能解释一下如何在我的情况下使用strftime或更正我的代码吗? 谢谢你的帮助。
答案 0 :(得分:4)
首先,以毫秒为单位存储日期并不是一个好主意。根据{{3}},您应该通过以下方式之一存储日期:
之后,它并不会影响您实际存储日期的方式,您可以随时使用Sqlite documentation (section 1.2)进行管理。
在您的情况下,您可以使用以下代码:
SELECT SUM(amount) FROM transactions
WHERE strftime('%m', transactionDate) = '05' // replace '05' with your month
看看我刚刚创建的strftime。正如您在那里看到的那样,日期时间可以以不同的方式存储,但strftime可以以相同的方式在所有日期时间内执行。
答案 1 :(得分:1)
首先计算你的范围可能更好,并使用BETWEEN
,如下所示:
public int getIncomeOfMonth(int monthNumber) {
final Calendar calendar = Calendar.getInstance();
calendar.add(Calednar.MONTH, monthNumber)
long start = calendar.getTimeInMillis();
calendar.add(Calendar.MONTH, 1);
long end = calendar.getTimeInMillis()
Cursor cursorIncome = db.rawQuery(
"SELECT sum(amount) FROM " + MyDbTable +
" WHERE " COLUMN_DATE + " BETWEEN " + start + " AND " + end, null);
int positiveTransacSelectedMonth = 0;
if(cursorPositiveTransac.moveToFirst()) {
positiveTransacSelectedMonth = (cursorPositiveTransac.getDouble(0));
}
return positiveTransacSelectedMonth;
}
答案 2 :(得分:1)
我建议这个查询:
"SELECT sum(amount) FROM" + MyDbTable +
"WHERE " + COLUMN_DATE + " between date('"+year +"-"monthNumber+"-01') and
date('"+year +"-"monthNumber+"-01",'start of month','+1 month','-1 day')"
或类似的东西,尝试得到这个:
SELECT sum(amount) FROM test WHERE date(date)
BETWEEN date('2015-01-01') AND date('2015-02-01')
我现在无法测试代码,抱歉。