我检索两个日期之间的数据,一些如何获得正确的结果,以及一些如何输出空列表视图,当我选择日期与月份工作正常但是当我选择日期超过一个月时,它输出空列表视图下面是我的代码< / p>
这里我在DB类中声明变量
public static final String EX_RowID = "_id";
public static final String EX_Cattype = "Ecattype";
public static final String EX_Date = "Ecdate";
public static final String EX_Price = "Ecprice";
public static final String EX_Type = "itype";
创建表语句
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + Food_TABLE +"(" +
EX_RowID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
EX_Cattype + " TEXT NOT NULL, " +
EX_Date + " TEXT NOT NULL," +
EX_Price + " INTEGER NOT NULL," +
EX_Type + " TEXT NOT NULL UNIQUE );"
);
}
输入数据方法
public long ExEntry(String Ecatgtype, String Edate, String Eprice, String Eitype) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();
cv.put(EX_Cattype, Ecatgtype);
cv.put(EX_Date, Edate );
cv.put(EX_Price, Eprice);
cv.put(EX_Type, Eitype);
return ourdatabase.insertOrThrow(Food_TABLE, null, cv);
}
这里我访问ExEntry方法
ExMgDB Expentry = new ExMgDB(ADD_EX.this);
Expentry.open();
Expentry.ExEntry(cate, date, price, itype);
Expentry.close();
这里我面临着这两个日期变量之间的问题
public Cursor CstmRpot(String fd, String td) {
// TODO Auto-generated method stub
String[] columns = new String[] {EX_RowID,EX_Cattype, EX_Date, EX_Price, EX_Type };
Cursor c= ourdatabase.query(Food_TABLE, columns, EX_Date + " BETWEEN '" + fd + "'
AND '" + td + "'" , null, null, null, null);
if (c != null) {
c.moveToFirst();
}
return c;
}
我可以像下面那样访问它
CustemRpt dbcs = new CustemRpt();
Cursor cursor = CstDB.CstmRpot(frmdate,tondate);
答案 0 :(得分:3)
有两个主要的解决方案。所有解决方案都有共同之处,即包含日期的列必须以某种方式进行排序。如果此订单被销毁,则您的数据已损坏且您的查询无法返回预期结果!
<强> 1。将您的日期保存为INTEGER
在您的数据库中,并使用方法将日期映射到数字:
一种可能的方法是使用Date.getTime ()
将日期映射到数字,但还有很多其他数据。重要的是
这样订购肯定是正确的。 要使用`Java.util.Date.getTime()实现此目的,如果只想存储日期,则只需将时间设置为0:00:00:000。
例如:
"CREATE TABLE " + Food_TABLE +"(" +
EX_RowID + "INTEGER PRIMARY KEY AUTOINCREMENT, " +
EX_Cattype + " TEXT NOT NULL, " +
EX_Date + " INTEGER NOT NULL," +
EX_Price + " INTEGER NOT NULL," +
EX_Type + " TEXT NOT NULL UNIQUE );"
private static String dateOnly(java.util.Date d) {
Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(d);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return Long.toString(cal.getTimeInMillis());
}
public Cursor CstmRpot(java.util.Date fd, java.util.Date td) {
// TODO Auto-generated method stub
String[] columns = new String[]{EX_RowID,EX_Cattype, EX_Date, EX_Price, EX_Type };
Cursor c= ourdatabase.query(Food_TABLE, columns, EX_Date + " > " + dateOnly (fd) + " AND " + EX_Date + " < " + dateOnly(td), null, null, null, null);
if (c != null) {
c.moveToFirst();
}
return c;
}
如果您不使用不同的时区,可以优化dateOnly(java.util.Date d)
。
当然你也可以使用JODA时间。
<强> 2。将您的日期保存为TEXT
如果选择此方法,那么比较日期列的查询将会慢一些,但数据库中的条目是人类可读的,而方法1的情况则不然。
TEXT
- 默认情况下,列以BINARY排序,这意味着memcmp()
用于比较值并确定哪个值更大或值是否相等。 (请记住x BETWEEN a AND b
表示x <= a AND x >= b
。)
您可以使用此功能memcmp()检查memcmp()
的工作。
为确保您获得正确的结果,您必须确保以下内容:
可能的日期格式可能如下所示:yyyy-MM-dd
(例如2014-02-04
或2000-12-24
)。
<强>通知书强>
Edittext
获取日期作为输入。答案 1 :(得分:0)
尝试SELECT * FROM "your table" WHERE date BETWEEN "from date" AND "to date";
答案 2 :(得分:0)
你需要存储yyyy-mm-dd的日期通知然后使用这个方法只需调用getWeekData(start_date,end_date);
public Object getWeekData(String start_date, String end_date) {
if (!mDataBase.isOpen())
openDataBase();
Object data = new Object ();
// Select All Query
String query = (String) ("Select * from " + TBL_NAME
+ " where " + (COL_DATE + " between '" + start_date + "' AND '" + end_date + "'"));
Cursor cursor = mDataBase.rawQuery(query, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
//get data over here
} while (cursor.moveToNext());
}
// closing connection
cursor.close();
close();
return data;
}
答案 3 :(得分:0)
我们有两个解决方案来解决这个问题
一个是我们需要将日期和时间转换为毫秒,并在
中采用长数据类型Sqllite数据库并保存值(转换日期和时间)。写查询就像“SELECT
dataname,start_date,end_date from tablename WHERE start_date&gt; end_date“。
第二种方式是你需要以字符串格式保存开始和结束日期+时间(yyy-MM-dd HH:mm:ss)
在Sqllite数据库中,你需要像这样查询,
“SELECT datetime_start,datetime_end FROM tablename WHERE((DATETIME(atetime_start)&gt; =
DATETIME(“+”'“+ entry_start_time +”'“+”)“+”AND DATETIME(datetime_end)&lt; DATETIME
( “+” ' “+ entry_end_time +”' “+”));