2015-11-02 145 views
2

我有一個存儲在非標準日期格式的SQLite表中的日期。我需要能夠由他們查詢。例如,今天的日期記錄在「日期」列中爲11/1/2015,在「sortDate」列中爲2015-11-1查詢不同格式的SQLite日期

我的查詢需要返回過去一週的記錄數。下面返回任何:SELECT count(*) FROM Grades WHERE sortDate BETWEEN '2015-10-24' AND '2015-11-02'

我也得到SELECT count(*) FROM Grades WHERE sortDate BETWEEN datetime('now', '-7 days') AND datetime('now')

什麼我認爲這個問題是我的日期不會填充總是有2個月份或日期的數字,如YYYY-MM-DD。我將如何查詢這些非標準格式的現有數據?

回答

1

由於Sqlite doesn't have a date type你需要做字符串比較來實現這一點。對於工作,你需要扭轉的順序 - 例如從DD/MM/YYYY至年月日,使用類似

where substr(column,7)||substr(column,4,2)||substr(column,1,2) 
     between '20101101' and '20101130' 
+0

我想我明白你在說什麼,但我的日期有時是'YYYY-MM-DD'有時'YYYY-M-D',根據不同的月份和日期是否是1位或2位。所以我不會總是知道子字符串的索引。 – NSouth

+0

如果月份或日期小於10,您可以只添加0值嗎?但在此之前,我需要知道你是如何得到日期的 –

+0

我該如何在查詢中做到這一點?或者我必須得到一個字符串結果的列表,將它們轉換爲java中的日期,然後編寫一個函數來「過濾」該列表並返回計數?我希望我可以在sqlite查詢中完成所有這些。 – NSouth

0

我結束了從數據庫中獲取所有日期字符串,並與他們在Java中處理。我只需要計算過去一週,過去兩週和過去一個月內有多少條記錄。我寫了下面的函數來根據提供的字符串ArrayList返回這些計數。

Calendar today = Calendar.getInstance(); 
     Calendar tomorrow = (Calendar) today.clone(); 
     tomorrow.add(Calendar.DATE, 1); 

     Calendar backDateWeek = (Calendar) today.clone(); 
     backDateWeek.add(Calendar.DATE, -7); 
     Calendar backDateTwoWeeks = (Calendar) today.clone(); 
     backDateTwoWeeks.add(Calendar.DATE, -14); 
     Calendar backDateMonth = (Calendar) today.clone(); 
     backDateMonth.add(Calendar.DATE, -30); 

     ArrayList<Calendar> calendarList = new ArrayList<Calendar>(); 
     Calendar tmpCal; 
     String strSplit[]; 
     int month; 
     int day; 
     int year; 
     int countWeek = 0; 
     int countTwoWeeks = 0; 
     int countMonth = 0; 
     for (String dateStr : dateStrings) { 
      strSplit = dateStr.split("/"); 
      month = Integer.parseInt(strSplit[0]) - 1; 
      day = Integer.parseInt(strSplit[1]); 
      year = Integer.parseInt(strSplit[2]); 
      tmpCal = Calendar.getInstance(); 
      tmpCal.set(Calendar.YEAR, year); 
      tmpCal.set(Calendar.MONTH, month); 
      tmpCal.set(Calendar.DAY_OF_MONTH, day); 

      if (tmpCal.after(backDateWeek) && tmpCal.before(tomorrow)) { 
       countWeek++; 
       countTwoWeeks++; 
       countMonth++; 
      } else if (tmpCal.after(backDateTwoWeeks) && tmpCal.before(tomorrow)) { 
       countTwoWeeks++; 
       countMonth++; 
      } else if (tmpCal.after(backDateMonth) && tmpCal.before(tomorrow)) { 
       countMonth++; 
      } 
     } 

     int[] countsArray = new int[3]; 
     countsArray[0] = countWeek; 
     countsArray[1] = countTwoWeeks; 
     countsArray[2] = countMonth; 

     return countsArray;