【问题标题】:Select a group of values from a specific month using Sqlite Query使用 Sqlite 查询从特定月份中选择一组值
【发布时间】:2015-05-04 17:52:07
【问题描述】:

我有一个按日期排序的数据库:

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

【问题讨论】:

    标签: android sqlite date android-sqlite


    【解决方案1】:

    首先,以毫秒为单位存储日期并不是一个好主意。根据Sqlite documentation (section 1.2),您应该以下列方式之一存储您的日期:

    • TEXT 作为 ISO8601 字符串 ("YYYY-MM-DD HH:MM:SS.SSS")。
    • REAL 作为儒略日数。
    • INTEGER 作为 Unix 时间,自 1970-01-01 00:00:00 UTC 以来的秒数。

    在那之后,它并不影响您实际存储日期的方式,您始终可以使用strftime 管理它。

    在您的情况下,您可以使用以下代码:

    SELECT SUM(amount) FROM transactions 
    WHERE strftime('%m', transactionDate) = '05' // replace '05' with your month
    

    this fiddle,我刚刚创建。如您所见,日期时间可以以不同的方式存储,但 strftime 可以以相同的方式作用于所有日期时间。

    【讨论】:

      【解决方案2】:

      最好先计算你的范围并使用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;
      }
      

      【讨论】:

        【解决方案3】:

        我建议这个查询:

        "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')
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-27
          • 2015-04-03
          • 2020-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-05
          • 1970-01-01
          相关资源
          最近更新 更多