2013-09-11 2 views
1

У меня есть база данных sqlite в моем проекте Android, и я стараюсь выбирать все строки между датами. Но ни одна строка не возвращается этим запросом:android sqlite диапазон дат

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 является типом даты.

Вы можете мне помочь? Вы нашли ошибку в моем коде?
Thank's
Jonathan.

EDIT: Я разместил здесь дополнительный код. запрос для создания таблицы:

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); 
+0

Что такое формат значений в столбце даты вступления? (SQLite не имеет типа 'Date'.) –

+0

Я просто добавляю некоторый код: как вы можете видеть, это тип даты в запросе создания, но я помещаю Strings. Я попробую с тиком TEXT как можно скорее. – user2769411

+0

Преобразование 'calendar.get (Calendar.MONTH)' в строку не гарантирует двухзначных чисел. –

ответ

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

Извините, но это не сработает с вашим решением. Может быть, проблема с вводом даты, поэтому я размещаю там какой-то код. – user2769411

1

Я не эксперт, но Android вы явно злоупотребляя date SQLite function. 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';"; 

Вы должны гарантировать, что данные столбца, возвращенного правильно отформатированный, а не строка, которую вы жестко!

0

sqlite не имеет встроенной формы даты. результат вашего запроса зависит от того, как данные хранятся в столбце ENTRY_DATE.

Я использую значения int для sqlite-date, которые преобразуются по java-коду. если ваш бизнес-лэйджер хочет найти диапазон дат, он может искать диапазон int.

Если вы выполняете свой запрос без фильтра, как выглядят значения результата?

, например, я конвертировать долго строку как этот

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; 
    } 
} 
Смежные вопросы