Firestore查询日期范围

时间:2019-03-26 02:07:08

标签: google-cloud-firestore querying

我的文档上有一个日期范围(使用日期对象),类似这样

{
  start: March 5
  end: April 7
}

我正在尝试弄清楚如何构建查询以返回涵盖特定日期的所有事件,例如March 27,例如...

查询内容类似于get all documents whose starting date is before march 27th, and the ending date is after march 27th的查询,但似乎由于Firestore查询限制而无法实现。

所以我已经花了好几个小时来为此建立查询,或者以某种允许的方式构造数据。

这有可能吗?

2 个答案:

答案 0 :(得分:0)

只需使用小于和大于该查询即可。例如,在我的用于快照侦听器(侦听更新)的android应用中,我已经做了类似的事情:

    ListenerRegistration registration;
    String lessDate = "09/04/2019 23:59:59";
    String greaterDate = "11/04/2019 23:59:59";
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss", Locale.getDefault());
    try {
        Date lDate = dateFormat.parse(lessDate);
        Date gDate = dateFormat.parse(greaterDate);
        Query q = db.collection("collection").whereGreaterThan("createdAt", new Timestamp(lDate))
                .whereLessThan("createdAt", new Timestamp(gDate));
        registration = q.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot value,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.i("FIRESTORE ERROR", "Listen failed.", e);
                    return;
                }
                for (DocumentChange doc : value.getDocumentChanges()) {
                    // What ever you want to do.
                }
            }
        });
    } catch (ParseException e) {
        e.printStackTrace();
    }

对于日期,您实际上可以从系统获取日期或从用户那里获取输入并根据需要自定义日期。让我知道您是否需要任何帮助。

答案 1 :(得分:-1)

使用上面的代码可以节省我的时间。我知道这种代码结构很奇怪,但是可以正常工作。 可以用来搜索日期范围,希望对您有所帮助!

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("Asia/Manila"));
    Date newDate = null;
    Date newDate1 = null;
    try {
        newDate = sdf.parse(YOUR_EDIT_TEXT + " 00:00:00");
        newDate1 = sdf.parse(YOUR_EDIT_TEXT + " 23:59:59");
    } catch (ParseException e) {
        e.printStackTrace();
    }


    db.collection("sales")
            .whereGreaterThanOrEqualTo("created_at", newDate)
            .whereLessThan("created_at", newDate1)
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    for(final DocumentSnapshot sales: task.getResult()) {
                        // Do what ever you want with the data.
                    }
                }
            });