使用Sqlite Query从特定月份中选择一组值

时间:2015-05-04 17:52:08

标签: android sqlite date android-sqlite

我有一个按日期排序的不同交易的数据库:

第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或更正我的代码吗? 谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

首先,以毫秒为单位存储日期并不是一个好主意。根据{{​​3}},您应该通过以下方式之一存储日期:

  • TEXT as ISO8601 strings(" YYYY-MM-DD HH:MM:SS.SSS")。
  • 真实的朱利安日数字。
  • INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。

之后,它并不会影响您实际存储日期的方式,您可以随时使用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')

我现在无法测试代码,抱歉。