两个日期对象的 “between” 查询在 Realm 中返回错误的输出

"between" query for two date objects are returning wrong output in Realm

提问人:Falling Into Infinity 提问时间:5/10/2016 最后编辑:Falling Into Infinity 更新时间:1/31/2019 访问量:5547

问:

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

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

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”。

我的查询中缺少什么吗?

Android Realm 领域列表

评论

1赞 EpicPandaForce 5/10/2016
你能试试吗?greaterThanOrEqual("timestamp", start).lessThanOrEqual("timestamp", end);
0赞 beeender 5/11/2016
我测试了您描述的情况,效果很好......请参阅 gist.github.com/beeender/13e149a073c19164415ea571c404cc80 你能用一些简单的代码片段重现它,以便我们看看吗?谢谢!

答:

1赞 Guybrush 4/20/2017 #1

我假设你的时间戳是字符串。在这种情况下,您存储的时间戳不正确。当对字符串执行>或<等操作时,就像对数字一样,您从左到右。27 介于 01 和 29 之间,所以它后面的数字并不重要。

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

3赞 Pavel Poley 1/31/2019 #2

对于最新版本,我们可以使用Realmbetween(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);

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

然后你可以使用 和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();