有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android SQLite在Date1和Date2之间选择

Mac OS-X

安卓

日食与ADT

SQLite

我刚开始创建Android应用程序,我对此进行了大量研究,但我一无所获。我需要查询我的SQLite数据库,以返回两个日期之间的所有行。到目前为止,我从研究中了解到,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));");

我没有收到任何错误,但我没有返回任何查询结果。这是我的代码:

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"

共 (4) 个答案

  1. # 1 楼答案

    不确定你在哪里读到的日期/时间应该存储为字符串!!! 我不同意

    我更喜欢将日期/时间存储为整数值。阅读: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时间内转换日期,反之亦然

    检查:http://developer.android.com/reference/java/util/Date.html#getTime%28%29

    选择时,您可以使用正常的select语句,如BETHE或任何您喜欢的语句

    我已经用了很多年了,它就像一个符咒:D

  2. # 2 楼答案

    好的,所以我无法让字符串日期工作,所以我必须先将字符串日期转换为日历日期,再将其添加到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());
                    }
                }
    
  3. # 3 楼答案

    连续两天获得前两名

    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%工作

  4. # 4 楼答案

    必须以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将无法理解它们,比较将无法工作(因为字符串必须以最重要的字段、年份开头,所有字段必须具有固定长度,以便字符串比较正确)