【问题标题】:android sqlite date rangeandroid sqlite 日期范围
【发布时间】:2013-09-12 17:43:47
【问题描述】:

我的 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);

【问题讨论】:

  • 输入日期列中的值的格式是什么? (SQLite 没有 Date 类型。)
  • 我刚刚添加了一些代码:如您所见,它是创建查询中的日期类型,但我输入了字符串。我会尽快尝试使用 TEXT 类型。
  • calendar.get(Calendar.MONTH) 转换为字符串不能保证得到两位数。
  • 正确:现在确定问题是逐字母比较:“8”(9 月)>“1”(12 月 12 日)。现在这不是更好的解决方案,但我会尝试用两位数强制日期和月份,如果没有其他解决方案,我会用字符串类型替换 Date 类型

标签: android sqlite date


【解决方案1】:

我不是 Android 专家,但您显然在滥用 date SQLite functiondate('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';";

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

【讨论】:

    【解决方案2】:

    试试这个:

    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()};
    

    【讨论】:

    • 抱歉,您的解决方案不能更好地工作。可能是日期插入的问题,所以我在那里放了一些代码。
    【解决方案3】:

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

    我正在为 sqlite-date 使用 int 值,这些值是由 java 代码转换的。如果您的业务层想要搜索日期范围,则数据库层可以搜索 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2012-07-30
      • 1970-01-01
      • 2014-01-07
      • 2020-06-14
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多