2017-09-29 4 views
-2

Voici ma structure de base de données pour ce jour: enter image description hereComment obtenir les 7 derniers jours lorsque le format de la date est yyyymdd

Je veux obtenir 3 résultats qui sont 2017/9/222017/9/242017/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: enter image description here

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. enter image description here

Comment puis-je obtenir exactement mes 7 derniers jours si mon format horaire de base de données est yyyymdd?

+0

Pourriez-vous partager projet/projet moqué sur github? – deadfish

+1

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

+0

@deadfish voulez-vous dire télécharger ce fichier sur github non? –

Répondre

1

essayer cette

final LocalDate currentDate= LocalDate.now(); 
final LocalDate date7Days = date.minusDays(7); 
//Format and display date 
final String formattedDate = date7Days.format(DateTimeFormatter.ISO_LOCAL_DATE); 
System.out.println(formattedDate); 

changement selon votre date format de l'heure

+0

Merci pour votre réponse, mais je ne trouve pas LocalDate et j'ai essayé yyyymmdd dans mon dernier essai. Toujours inclure mon premier et deuxième essai. –