1

我的 Android 项目中有一个 sqlite DB,我尝试选择日期之间的所有行。但是这个查询没有返回任何行:

String where = OperationEntry.COLUMN_NAME_ENTRY_ACCOUNT_FK + " = ? AND " +
           OperationEntry.COLUMN_NAME_ENTRY_DATE + " > date('2013-01-01') AND "+
           OperationEntry.COLUMN_NAME_ENTRY_DATE + " < date('2013-12-31') ;";
String[] whereValue = {accountName};

Cursor c = db.query(
    OperationEntry.TABLE_NAME,  // The table to query
    projection,                 // The columns to return
    where,          // The columns for the WHERE clause 
    whereValue,                 // The values for the WHERE clause
    null,                       // don't group the rows
    null,                       // don't filter by row groups
    sortOrder                   // The sort order
);

此外,如果我使用 2013-01-01 和 2014-12-31,所有行都匹配。
我已经测试过有无日期的功能,我有同样的问题。
请注意 OperationEntry.COLUMN_NAME_ENTRY_DATE 是 Date 类型。

你能帮助我吗?你发现我的代码有什么错误吗?
谢谢
乔纳森。

编辑:我在这里放了一些额外的代码。表创建查询:

public static final String SQL_CREATE_ENTRIES =
"CREATE TABLE IF NOT EXISTS " + OperationEntry.TABLE_NAME + " (" +
    OperationEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
         ... +
    OperationEntry.COLUMN_NAME_ENTRY_DATE + " DATE, " + ...
" )";

插入查询:

GregorianCalendar calendar = ...;
String date = calendar.get(Calendar.YEAR) + "-" + calendar.get(Calendar.MONTH) + "-" + calendar.get(Calendar.DAY_OF_MONTH);
ContentValues values = new ContentValues();
values.put(OperationEntry.COLUMN_NAME_ENTRY_TITLE, operation.getTitle());
values.put(OperationEntry.COLUMN_NAME_ENTRY_QTE, operation.getQte());
values.put(OperationEntry.COLUMN_NAME_ENTRY_DATE, date);
    ...

long newRowId;
newRowId = db.insert(
    OperationEntry.TABLE_NAME,
    null,
    values);
4

3 回答 3

1

我不是 Android 专家,但您显然在滥用日期 SQLite 函数date('2013-01-01')是没有意义的,它的计算结果为'2013-01-01'

请尝试:

String where = OperationEntry.COLUMN_NAME_ENTRY_ACCOUNT_FK + " = ? AND " +
           "date(" + OperationEntry.COLUMN_NAME_ENTRY_DATE + ") > '2013-01-01' AND " +
           "date(" + OperationEntry.COLUMN_NAME_ENTRY_DATE + ") < '2013-12-31';";

您需要确保返回的列数据格式正确,而不是您硬编码的字符串!

于 2013-09-12T09:03:37.693 回答
0

sqlite 没有内置日期格式。您查询的结果取决于数据如何存储在 ENTRY_DATE 列中。

我正在使用由 java 代码转换的 sqlite-date 的 int 值。如果您的业务层想要搜索日期范围,则数据库层可以搜索一个 int 范围。

如果您在没有 where 过滤器的情况下执行查询,结果值如何?

例如我像这样从长转换为字符串

final private static java.text.DateFormat isoDateTimeformatter = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ");

public static String getDateStr(long dateTime) {
    if (dateTime == TimeSlice.NO_TIME_VALUE) {
        return "";
    } else {
        return isoDateTimeformatter.format(new Date(dateTime));
    }
}

从字符串转换回长我使用这个

public static long parseDate(String mDateSelectedForAdd) {
    try {
        return isoDateTimeformatter.parse(
                mDateSelectedForAdd).getTime();
    } catch (ParseException e) {
        Log.w(Global.LOG_CONTEXT,"cannot reconvert " + mDateSelectedForAdd + " to dateTime using " + isoDateTimeformatter,e);
        return TimeSlice.NO_TIME_VALUE;
    }
}
于 2013-09-12T09:36:06.413 回答
0

尝试这个:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date firstDate = formatter.parse("2013-01-01");
Date endDate = formatter.parse("2013-12-31");
String where = OperationEntry.COLUMN_NAME_ENTRY_ACCOUNT_FK + " = ? AND " +
OperationEntry.COLUMN_NAME_ENTRY_DATE + " > ? AND "+
OperationEntry.COLUMN_NAME_ENTRY_DATE + " < ?";
String[] whereValue = {accountName, firstDate.getTime(), endDate.getTime()};
于 2013-09-11T16:45:57.690 回答