使用日期的Ormlite查询

时间:2012-05-26 09:54:52

标签: android ormlite query-builder

public GenericRawResults<Object[]> getCountByStatus(Date date,int status){
        Log.info("CallDayPlanningDao",date.toString());
        GenericRawResults<Object[]> rawResults=null;
        Dao callDayPlanningDao = getDao(CallDayPlanning.class);
        QueryBuilder query = callDayPlanningDao.queryBuilder();
        int year = date.getYear();
        int month = date.getMonth();
        Date date1 = new Date(year, month,1);
        Date date2 = new Date(year, month+1,1);

        Date startDate = new Date(date1.getTime()-5);
        Date endDate = new Date(date2.getTime()-5);
        try {
            **query.where().between("calldate", startDate, endDate);**//This line is not working
            if(status==Constant.cnStatus){
                query.where().in("callstatus", status,Constant.ccStatus);
            }else{
                query.where().eq("callstatus", status);
            }
            query.groupBy("calldate");
            query.selectRaw("calldate,count(*)");
            rawResults = callDayPlanningDao.queryRaw(query.prepareStatementString(), new DataType[] {
                            DataType.DATE_STRING, DataType.INTEGER });
            // page through the results

        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return rawResults;
    }

好吧,我想获取对象的计数,但是日期条件无效,我从我的数据库中获取所有数据。有人可以帮助我吗?谢谢。

2 个答案:

答案 0 :(得分:3)

我是ORMLite的新手,在访问SQLite数据库时遇到了同样的问题。

我今天花了一整天才弄明白,这是摘要:

  1. 我找到格式&#34; yyyy-M-d H:m:s&#34;在ORMLite中处理SQLite DateTime数据类型的工作正常,而不是ORMLite的默认格式&#34; yyyy-MM-dd HH:mm:ss.SSSSS&#34;。

  2. 让ORMLite在&#34; Java Date&#34;之间进行翻译。和#34; SQLite DateTime&#34;,将需要一个持久性类。

  3. 这里显示了我使用的persister类的代码,它覆盖了DateStringType的公共函数并使用&#34; dateFormatConfig&#34;而不是defaultDateFormatConfig&#34; :

  4. `

    public class DateStringSQLiteType extends DateStringType {
    
    protected static final DateStringFormatConfig dateFormatConfig = new DateStringFormatConfig(
            "yyyy-M-d H:m:s");
    
    private static final DateStringSQLiteType singleTon = new DateStringSQLiteType();
    
    public static DateStringSQLiteType getSingleton() {
        return singleTon;
    }
    
    private DateStringSQLiteType() {
        super(SqlType.STRING, new Class<?>[0]);
    }
    
    /**
     * Convert a default string object and return the appropriate argument to a
     * SQL insert or update statement.
     */
    @Override
    public Object parseDefaultString(FieldType fieldType, String defaultStr)
            throws SQLException {
        DateStringFormatConfig formatConfig = convertDateStringConfig(
                fieldType, dateFormatConfig);
        try {
            // we parse to make sure it works and then format it again
            return normalizeDateString(formatConfig, defaultStr);
        } catch (ParseException e) {
            throw SqlExceptionUtil.create("Problems with field " + fieldType
                    + " parsing default date-string '" + defaultStr
                    + "' using '" + formatConfig + "'", e);
        }
    }
    
    /**
     * Return the SQL argument object extracted from the results associated with
     * column in position columnPos. For example, if the type is a date-long
     * then this will return a long value or null.
     * 
     * @throws SQLException
     *             If there is a problem accessing the results data.
     * @param fieldType
     *            Associated FieldType which may be null.
     */
    @Override
    public Object resultToSqlArg(FieldType fieldType, DatabaseResults results,
            int columnPos) throws SQLException {
        return results.getString(columnPos);
    }
    
    /**
     * Return the object converted from the SQL arg to java. This takes the
     * database representation and converts it into a Java object. For example,
     * if the type is a date-long then this will take a long which is stored in
     * the database and return a Date.
     * 
     * @param fieldType
     *            Associated FieldType which may be null.
     * @param sqlArg
     *            SQL argument converted with
     *            {@link #resultToSqlArg(FieldType, DatabaseResults, int)} which
     *            will not be null.
     */
    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos)
            throws SQLException {
        String value = (String) sqlArg;
        DateStringFormatConfig formatConfig = convertDateStringConfig(
                fieldType, dateFormatConfig);
        try {
            return parseDateString(formatConfig, value);
        } catch (ParseException e) {
            throw SqlExceptionUtil.create("Problems with column " + columnPos
                    + " parsing date-string '" + value + "' using '"
                    + formatConfig + "'", e);
        }
    }
    
    /**
     * Convert a Java object and return the appropriate argument to a SQL insert
     * or update statement.
     */
    @Override
    public Object javaToSqlArg(FieldType fieldType, Object obj) {
        DateFormat dateFormat = convertDateStringConfig(fieldType,
                dateFormatConfig).getDateFormat();
        return dateFormat.format((Date) obj);
    }
    
    /**
     * @throws SQLException
     *             If there are problems creating the config object. Needed for
     *             subclasses.
     */
    @Override
    public Object makeConfigObject(FieldType fieldType) {
        String format = fieldType.getFormat();
        if (format == null) {
            return dateFormatConfig;
        } else {
            return new DateStringFormatConfig(format);
        }
    }
    
    }
    

    `

    1. 使用符号定义数据类: @DatabaseField(..., persisterClass = DateStringSQLiteType.class) private Date date;

    2. 它对我来说很好,可以做到&#34;之间&#34;查询如:

      list = foo.getDao().queryBuilder().where().between(HistoryStandardView.DATE_FIELD_NAME, new Date(98,1,1), new Date(115,1,1)).query();
      
    3. ORMLite的记录器显示结果语句:

      [DEBUG] StatementExecutor查询&#39; SELECT * FROM`DistoryStandardView` WHERE`date` BETWEEN&#39; 1998-2-1 0:0:0&#39; AND&#39; 2015-2-1 0:0:0&#39; &#39;返回2结果

答案 1 :(得分:1)

如果您的calldate列类型为DataType.DATE_STRING错误,请更正我?如果是这种情况,则意味着持久化数据类型为VARCHAR,因此当您执行查询时,执行字符串比较而不是日期比较。因此,要解决您的问题,您可以:

  1. 将您的calldate列的类型更改为DataType.DATE,表示为TIMESTAMP
  2. calldate列的类型更改为DataType.DATE_LONG
  3. 找到一种方法来进行符合您需要的字符串比较(例如,如果您的date(calldate)值与时间字符串格式匹配,请调用sql calldate函数,请参阅http://www.sqlite.org/lang_datefunc.html)。< / LI>

    这就是我所做的,它不是很漂亮,但工作就像是:

    QueryBuilder<OffreEntity, Integer> qb = this.daoOffre.queryBuilder();
    //Need to format the date i want to compare so it can actually be compare with what i have on db
    SimpleDateFormat dateFormatter = new SimpleDateFormat("yyMMdd");
    String correctFormat = dateFormatter.format(dateLimite);
    //In db the date is represented as a VARCHAR with format dd/MM/yy so i need to reformat so it matches yyMMdd
    String rawQuery = String.format("substr(%1$s,7)||substr(%1$s,4,2)||substr(%1$s,1,2) > '%2$s'", OffreEntity.COLUMN_NAME_DATE, correctFormat);
    qb.where().raw(rawQuery);
    offresDept = qb.query();
    

    希望它有所帮助!

      

    Ps:感谢Jack Douglas的date format query