Voici ma structure de base de données pour ce jour: Comment obtenir les 7 derniers jours lorsque le format de la date est yyyymdd
Je veux obtenir 3 résultats qui sont 2017/9/22
2017/9/24
2017/9/25
si aujourd'hui est 2017/9/29
.
Sur ma classe DatabaseHandler j'ai essayé le code suivant:
public List<Contact> latestDays() {
List<Contact> contactList = new ArrayList<>();
// My database time format is: yyyymdd
Calendar mCalendar = new GregorianCalendar();
int mYear = mCalendar.get(Calendar.YEAR);
int mMonth = mCalendar.get(Calendar.MONTH)+1;
int mDay = mCalendar.get(Calendar.DAY_OF_MONTH);
String today = String.valueOf(mYear).concat(String.valueOf(mMonth).concat(String.valueOf(mDay)));
System.out.println(today+"today");
SQLiteDatabase db = this.getWritableDatabase();
String selectQuery = "SELECT * FROM " + TABLE_CONTACTS + " WHERE date > (SELECT DATETIME('" + today + "'," + "'-7" + " day'))";
Cursor cursor = db.rawQuery(selectQuery, null);
//looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Contact contact = new Contact();
contact.setID(Integer.parseInt(cursor.getString(0)));
contact.setDate(cursor.getString(1));
contact.setBeforeMorning(cursor.getString(2));
contact.setAfterMorning(cursor.getString(3));
contact.setBeforeNoon(cursor.getString(4));
contact.setAfterNoon(cursor.getString(5));
contact.setBeforeNight(cursor.getString(6));
contact.setAfterNight(cursor.getString(7));
System.out.println("The result is :" + cursor.getString(1));
//Adding contact to list
contactList.add(contact);
} while (cursor.moveToNext());
}
return contactList;
}
Je l'appelle sur mon MainActivity comme ceci:
private DatabaseHandler db;
contactList = db.latestDays();
System.out.println(contactList.size());
imprimer le résultat comme ceci:
Je récupère tous mes enregistrements mais ce n'est pas ce que je veux.
La raison en est probablement mon format de date, donc j'ajouter mon tri toutes les dates par yyyymmdd au raqQuery:
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CONTACTS +" WHERE date > (SELECT DATETIME('" + today + "'," + "'-7" + " day'))" +
" ORDER BY\n" +
" SUBSTR(Date, 1, 4) DESC,\n" +
" CASE WHEN INSTR(SUBSTR(Date, 6), '/') = 2\n" +
" THEN '0' || SUBSTR(Date, 6, 1)\n" +
" ELSE SUBSTR(Date, 6, 2) END DESC,\n" +
" CASE WHEN LENGTH(SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1)) = 1\n" +
" THEN '0' || SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1)\n" +
" ELSE SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1) END DESC; ",null);
Je reçois toujours le même résultat ...
J'ai donc essayé de trouver une autre solution et essayé comme ceci, je change la syntaxe de recherche SQL:
Calendar mCalendar = new GregorianCalendar();
int mYear = mCalendar.get(Calendar.YEAR);
int mMonth = mCalendar.get(Calendar.MONTH)+1;
int mDay = mCalendar.get(Calendar.DAY_OF_MONTH);
String today = String.valueOf(mYear).concat(String.valueOf(mMonth).concat(String.valueOf(mDay)));
System.out.println(today+"today");
Calendar theEnd = Calendar.getInstance();
Calendar theStart = (Calendar) theEnd.clone();
theStart.add(Calendar.DAY_OF_MONTH, -7);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-M-dd");
String start = dateFormat.format(theStart.getTime());
String end = dateFormat.format(theEnd.getTime());
// Now you have date boundaries in TEXT format
Cursor cursor = db.rawQuery("SELECT * FROM contacts WHERE date BETWEEN "+start+" AND "+end +
" ORDER BY\n" +
" SUBSTR(Date, 1, 4) DESC,\n" +
" CASE WHEN INSTR(SUBSTR(Date, 6), '/') = 2\n" +
" THEN '0' || SUBSTR(Date, 6, 1)\n" +
" ELSE SUBSTR(Date, 6, 2) END DESC,\n" +
" CASE WHEN LENGTH(SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1)) = 1\n" +
" THEN '0' || SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1)\n" +
" ELSE SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1) END DESC; ", null);
Son pire, je ne reçois aucune donnée.
Comment puis-je obtenir exactement mes 7 derniers jours si mon format horaire de base de données est yyyymdd?
Pourriez-vous partager projet/projet moqué sur github? – deadfish
pour vous dates de magasin de santé dans un certain format triable ... fx comme 'LONG' (comme milis) ou dans le format' aaaa/mm/jj' (les deux jours et les mites avec des zéros de tête) ... alors évidemment ** même si trié en tant que chaîne ** '2017/10/1' sera plus grand que '2017/9/31' (ce qui n'est pas vrai avec votre format) comme 9> 1 ... tout est parce que ** il n'y a pas de type DATETIME en sqlite ** (à 2017-09) – Selvin
@deadfish voulez-vous dire télécharger ce fichier sur github non? –