如何计算Sqlite表中与日期限制匹配的记录?

时间:2013-05-08 13:22:17

标签: android sqlite date android-cursorloader

我正在使用CursorLoader从我的Content Provider返回记录计数,我只需要计算7天或更短时间内的记录。我做这项工作的尝试到目前为止只产生了挫折感,因为计数总是为零。我对Sqlite和CursorLoaders的经验有限,我怀疑我犯了一个非常简单的错误。这是我的代码:

String strCriteria = "SELECT julianday('now') - julianday('" + Session.DATE_STRING
            + "','gregorian') <8";

return new CursorLoader(getSherlockActivity(), Session.CONTENT_URI, 
           new String[] {"count(" + Session.TABLE_NAME + "." + Session._ID +") AS Count " }, 
          strCriteria, null,null);  

谁能看到我哪里出错了?

我应该补充一点,DATE_STRING列将日期存储为yyyy-MM-dd格式的字符串。我实际上有另一个列存储日期为长,但我还没有弄清楚如何使用数值进行Sqlite日期查询。

更新提问:如果我用文本日期替换strCriteria定义的Session.DATE_STRING部分,那么一切都很完美。例如,如果我使用以下代码:

String strCriteria = "SELECT julianday('now') - julianday('" + "2013-05-08"
            + "','gregorian') <8";

...而不是我上面所说的,那一切都完美无缺。这让我相信我的代码实际上并没有将Session.DATE_STRING列的放入字符串中,而是放入其他内容,很可能是列的实际字符串名称。我不知道如何解决这个问题,因为我假设查询实际上会在运行时填入正确的数据值。任何建议将不胜感激!

编辑解决方案:我已经想出如何让它正常工作。这很简单 - 我必须从Session.DATE_STRING周围删除'以确保插入列的值,而不是列名。所以,这就是strCriteria需要定义的方式:

String strCriteria = "SELECT julianday('now') - julianday(" + Session.DATE_STRING
            + ",'gregorian') <8";

1 个答案:

答案 0 :(得分:0)

我不确定这是否适用于您的目的,但我的应用程序中确实有一个缓存清理程序清除数据库中可能已存储超过x天的任何记录。

第一步:保存每条记录时,我将日期保存为毫秒。请记住,我还将日期保存为String,因为我也将其用于标签和其他内容。

Ste Two :创建Where语句:

String where = DbOpenHelper.SAVED_ON + " <= " + (System.currentTimeMillis() - msBackInTime);

其中msBackInTime是我要删除的毫秒天数。例如,如果我想回三天并擦除,那么msBackInTime将是:259200000。这样,查询将返回任何较少的项目(因此意味着它们存储之前)比结果提供的日期。

快速举例:

现在是:1368020762363 in millis。 millis的三天是:259200000 三天前是:现在(1368020762363)减去三天(259200000)。

因此,SAVED_ON值低于差异结果的任何内容都是我在查询中得到的结果。

希望有所帮助。