3

我正在存储带有时间戳的购买交易(购买时的日期时间对象完全相同)。当我尝试从开始和结束日期提取结果时,它给出了错误的结果。

这是我正在存储的日期对象/格式的示例,

27-01-2016
27-02-2016
10-05-2016
27-05-2016

这是在两个日期之间检索对象的查询,

RealmResults<Transactions> result = realm.where(Transactions.class)
                .between("timestamp", start, end)
                .findAll();

现在对于给定的开始日期: 01-01-16 & ending_date: 29-02-2016,它返回一个 不正确的对象“27-01-2016” 。

我的查询有什么遗漏吗?

4

2 回答 2

3

对于最新Realm版本,我们可以使用between(String fieldName, Date from, Date to)

如果您使用“27-01-2016”格式,请在保存之前重置此值date

    Calendar cal = new GregorianCalendar();
            cal.setTime(date);
            cal.set(Calendar.HOUR_OF_DAY, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);


   RealmObject.setDbDate(cal.getTime());

然后您可以查询,确保正确设置startDateendDate范围

query.between(RealmObject.FIELD_DATE, startDate, endDate);

但是,有时between()是不够的,因为它不允许链接对象,例如当您搜索其子项(也包含日期的 RealmObject)与日期范围匹配的所有项目时。

然后你可以使用greaterThanOrEqualTo(String fieldName, Date value)lessThanOrEqualTo(String fieldName, Date value)

             query.greaterThanOrEqualTo(RealmObject.FIELD_LINKED_OBJECT + "." + LinkedObject.FIELD_DATE, startDate)
                    .findAll()
                    .where()
                    .lessThanOrEqualTo(RealmObject.FIELD_LINKED_OBJECT + "." + LinkedObject.FIELD_DATE, endDate)
                    .findAll();
于 2019-01-30T17:39:48.963 回答
1

我假设您的时间戳是字符串。在这种情况下,您错误地存储了时间戳。在字符串上执行 > 或 < 等操作时,与数字一样,您从左到右。27 介于 01 和 29 之间,因此它后面的数字无关紧要。

为了像这样查询,您需要从最大值到最小值保存,或 YYYY-MM-DD,这样从左到右实际上会正确比较。显然,您的开始日期和结束日期也必​​须采用这种格式。您已经确保有前导 0,这也很重要。

于 2017-04-20T14:06:17.667 回答