当前位置: 首页 > 面试题库 >

在两个日期之间从Sqllite DB中检索数据

赵永逸
2023-03-14
问题内容

我检索两个日期之间的数据,当我选择带有月份的日期时,它如何获得正确的结果,以及如何输出空列表视图,但是当我选择一个月以上的日期时,下面的输出空列表视图是我的代码

在这里我在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);

问题答案:

有两种主要解决方案。所有解决方案的共同点是,必须以某种方式对包含日期的列进行排序。如果该命令被销毁,则您的数据已损坏,查询将无法返回预期结果!

1.将“日期”另存为INTEGER数据库中的数据,并使用一种方法将“日期”映射为数字:

一种可能的方法是用于Date.getTime ()将日期映射到数字,但是还有许多其他方法。重要的是

  1. 相等的日期得到相同的数字,
  2. 另一个日期之后的日期会得到更大的数字。

这种订购方式肯定是正确的。要使用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-time。

2.将您的日期另存为TEXT

如果选择此方法,则比较日期列的查询会慢一些,但是数据库中的条目是人类可读的,方法1
TEXT并非如此。-列使用BINARY排序默认情况下,这意味着memcmp()用于比较这些值并确定哪个值更大或两个值是否相等。(记住x BETWEEN a AND b手段x <= a AND x >= b。)您可以检查工作memcmp()具有这种功能memcmp()


为了确保获得正确的结果,必须确保以下几点:

  1. 数据库中的所有日期值必须具有相同的文本长度。
  2. 数据库中的所有日期值都必须采用相同的格式。较大的日期部分(年)必须早于较小的日期部分(月)。
  3. 查询中日期值的所有参数也必须遵循这些规则。

可能的日期格式可能看起来像这样:(yyyy-MM-dd例如2014-02-042000-12-24)。

忠告

  • 使用android.widget.DatePicker代替Edittext获取日期作为输入。
  • 切勿在查询中直接使用从用户输入中获得的任何文本,而应在之前进行验证(请参阅sql-injection)。
  • 阅读一些有关如何比较字符串的文章。


 类似资料:
  • 问题内容: 我从Stackoverflow那里获得了这段代码,并对其进行了少许更改以适应今天的日期。 我想检查今天是否适合两个日期之间。但这是行不通的。我想念什么? 问题答案: 编辑: 使用<=或> =来计算今天的日期 这是您的代码的正确答案。只需使用strtotime()php函数

  • 问题内容: 我正在使用数据库存储日志,其中“日期”列保存了插入日期。日期的格式为“ MM / DD / YY”。请任何人建议我如何在两个特定日期之间选择数据。例如,我尝试了这个: 但是我想这行不通,因为日期不是数字。谢谢您的帮助!:) 问题答案: 使用关键字:

  • 问题内容: 我需要生成两个给定日期之间的所有日期。只要只有一个日期范围,此方法就可以正常工作。但是,如果我有多个日期范围,则此解决方案不起作用。我在这里以及Asktom上都进行了搜索,但是找不到相关的指针/解决方案。 我使用all_objects和CONNECT BY ROWNUM尝试了两种解决方案,但是没有运气。这是问题说明:sqlfiddle 输入 输出 问题答案:

  • 问题内容: 我已将用户注册的日期保存为日期时间,例如 2011-12-06 10:45:36 。我已运行此查询,并且希望此项目 -2011-12-06 10: 45 : 36- 将被选择: 但是不是。存在任何优雅的方式,该如何选择?我最初的想法是,但是看起来不太好。 问题答案: 您的问题是日期的简短版本使用午夜作为默认设置。因此,您的查询实际上是: 这就是为什么您看不到10:45的记录的原因。 更

  • 问题内容: 我有这个模型: 和存储库为 我想做的是,我将传递一个日期,并需要检查该日期在和之间(例如,我将9月30日作为日期传递,并且需要查找9月30日在其和之间的所有条目) 像什么? 问题答案: 您应该看一下参考文档。很好解释。 就您而言,我认为您不能在两者之间使用,因为您需要传递两个参数 之间 -findByStartDateBetween…其中x.startDate在?1和?2之间 根据您的

  • 问题内容: 查看两个日期之间有多少整天的最短方法是什么?这就是我现在正在做的。 问题答案: 假设您确实有两个日期对象,则可以从另一个对象中减去一个,然后查询结果对象的天数: 它也适用于日期时间-我认为它会四舍五入到最近的日期: