Mac OS-X
Android
带有ADT的EclipseSQLite的
我是创建Android应用程序的新手,我对此进行了大量研究,但我无处可去。我需要查询我的SQLite数据库以返回2个日期之间的所有行。到目前为止,我从我的研究中学到的是Androids SQLite数据库中没有DateTime列,我必须将其保存为文本列。但我认为问题在于尝试比较字符串,但我无法找到解决方法。这是我的代码:
DB = currentContext.openOrCreateDatabase(DBName, 0, null);
DB.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, Date VARCHAR(40), Hours INT(3));");
我没有收到任何错误,但我没有从RawQuery返回任何结果。这是我的代码:
Cursor c = newDB.rawQuery("select ID, Date, Hours from " + tableName + " where Date BETWEEN '" + date1 + " 00:00:00' AND '" + date2 + " 99:99:99'", null);
if (c != null ) {
Log.d(TAG, "date1: "+date1);
Log.d(TAG, "date2: "+date2);
if (c.moveToFirst()) {
do {
int id = c.getInt(c.getColumnIndex("ID"));
String date1 = c.getString(c.getColumnIndex("Date"));
int hours1 = c.getInt(c.getColumnIndex("Hours"));
results.add(+ id + " Date: " + date1 + " Hours: " + hours1);
}
while (c.moveToNext());
}
}
我也尝试了以下声明,但它们也没有产生结果:
Cursor c = newDB.rawQuery("select ID, Date, Hours from " + tableName + " where Date BETWEEN " + Date(date1) + " AND " + Date(date2) + "", null);
我从其他StackOverflow答案中得到了这个声明,但我找不到有关date()方法的任何文档。我不确定它现在是否已过时,但我得到错误说“类型(类名)的日期(字符串)方法未定义”,我尝试导入一些JAVA库。
有没有人知道创建rawData()查询的正确方法,该查询将获取所选日期之间的行?
更多信息,这些是我的INSERT语句和进入数据库的日期格式:
newDB.execSQL("INSERT INTO " + tableName + " (Date, Hours) Values ('" + ph_date + "'," + hours + ");");
String date1 = "12/1/13"
String date2 = "25/1/13"
答案 0 :(得分:6)
好的,所以我无法使字符串日期起作用,所以我必须将字符串日期转换为日历日期到Unix时间,然后再将它们添加到SQLite数据库并在显示时将它们转换回(Unix时间到日历日期到字符串)他们。 Unix Time允许在日期列上完成计算(按顺序排序,升序排序,等等),这是长时间试用和错误后使用的最佳方法。这是我最终使用的代码:
Cursor c = newDB.rawQuery("select ID, Date, Hours from " + tableName + " where Date BETWEEN '" + startDateQueryDate + "' AND '" + endDateQueryDate + "' ORDER BY Date ASC", null);
if (c != null ) {
if (c.moveToFirst()) {
do {
int tempId = c.getInt(c.getColumnIndex("ID"));
long tempUnixTime = c.getLong(c.getColumnIndex("Date"));
//convert tempUnixTime to Date
java.util.Date startDateDate = new java.util.Date(tempUnixTime);
//create SimpleDateFormat formatter
SimpleDateFormat formatter1;
formatter1 = new SimpleDateFormat("dd/MM/yyyy", Locale.UK);
//convert Date to SimpleDateFormat and convert to String
String tempStringStartDate = formatter1.format(startDateDate);
int tempHours = c.getInt(c.getColumnIndex("Hours"));
results.add(+ tempId + " Date: " + tempStringStartDate + " Hours: " + tempHours);
}while (c.moveToNext());
}
}
答案 1 :(得分:5)
您必须以understood by SQLite格式存储日期值。
对于普通日期,这将是YYYY-MM-DD
字符串,或秒值或朱利安日期数。
要将日期格式化为字符串,请使用以下内容:
Date date1 = ...;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String dateAsString = df.format(date1);
要将日期格式化为秒值,请将Date.getTime()
的返回值除以1000。
如果日期变量已经是字符串,则必须确保它们具有正确的格式。
如果您的日期字符串没有yyyy-MM-dd
格式,SQLite的date functions将无法理解它们,并且比较将不起作用(因为字符串必须以最重要的字段,年份和所有字段必须具有固定长度,以便字符串比较正确)。
答案 2 :(得分:4)
获得2天的前两名
Calendar cal = Calendar.getInstance();
Date now = new Date();
cal.setTime(now);
String currentDate = sdf.format(cal.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, -1);
String previusdDate = sdf.format(cal.getTimeInMillis());
Log.e("Start date", currentDate);
Log.e("End date", previusdDate);
SQLiteOpenHelper helper;
SQLiteDatabase db;
helper = new My_SQliteHelper(mContext, "MyDB", null, 1);
db = helper.getWritableDatabase();
Cursor cr = db.rawQuery("SELECT name,sum(minutes),date FROM Historyinfo WHERE date BETWEEN '" + previusdDate + "' AND '" + currentDate + "' GROUP BY name ORDER BY SUM(minutes) DESC LIMIT 2", null);
100%正常工作
答案 3 :(得分:-1)
不确定您在哪里阅读日期/时间应存储为字符串!!! 我不同意。
我更喜欢将日期/时间存储为INTEGER值。阅读:http://www.sqlite.org/datatype3.html#datetime
插入数据时,将日期/时间转换为Unix时间,即自1970-01-01 00:00:00 UTC以来的秒数。对于例如2012年1月1日00:00:00 GMT表示为1356998400000
Android Date / Calendar类内置了在UNIX Times中转换日期的功能,反之亦然。
检查:http://developer.android.com/reference/java/util/Date.html#getTime%28%29
选择时,您可以使用普通的选择语句,例如BETWEEN或您喜欢的任何语句。
我多年来一直在使用它,它就像一个魅力:D