日期间筛选器的等效数据库

yhqotfr8  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(289)

我是来自mysql的reinspectdb的新手,我有一些使用reinspectdb的任务。
现在,我想实现一些像。。。
mysql数据库:

select * 
from reservations
where 
    room_id = '7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a' and
    ((reservation_start between `11-01-2018 00:00:00` and `11-30-2018 23:59:59`) OR
    (reservation_end between `11-01-2018 00:00:00` and `11-30-2018 23:59:59`))

重新思考数据库:
这是使用 filter() ,感谢@peter:

r.db("myDb").table("reservations").filter(function(doc){ 
    return 
        doc("room_id").eq("7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a")
            .and(doc("reservation_start").gt("2018-12-01T00:00:00").and(doc("reservation_start").lt("2018-12-10T23:59:59"))
                .or(doc("reservation_end").gt("2018-12-01T00:00:00").and(doc("reservation_end").lt("2018-12-10T23:59:59"))))
    }
)

但我不知道如何将两个日期范围的检查转换为多个日期范围之间的检查。
谢谢!

vybvopom

vybvopom1#

现在我更了解你的问题了
首先要将查询转换为java:

r.db("myDb").table("reservations").filter(doc ->
    doc.g("room_id").eq("7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a")
      .and(doc.g("reservation_start").gt("2018-12-01T00:00:00").and(doc.g("reservation_start").lt("2018-12-10T23:59:59"))
      .or(doc.g("reservation_end").gt("2018-12-01T00:00:00").and(doc.g("reservation_end").lt("2018-12-10T23:59:59")))))

现在,您最好使用房间id作为辅助索引:
r、 db(“mydb”).table(“预订”).indexcreate(“房间号”)
然后您可以在查询中使用:

r.db("myDb").table("reservations")
    .getAll("7cc8e51d-e3fa-4d84-b7e6-9ebf8975754a")
    .optArg("index","room_id")
    .filter(...)

“但我不知道如何将两个日期范围的检查转换为多个日期范围之间的检查。”
1.)创建复合数组索引

r.db("myDb").table("reservations").indexCreate(
    "reservation_date", [r.row("reservation_start"), r.row("reservation_end")]

2.)使用between查询

r.db("myDb").table("reservations").between(
    ["2018-12-01T00:00:00", "2018-12-01T00:00:00"], ["2018-12-10T23:59:59", "2018-12-10T23:59:59"], {index: "reservation_date"}
)

//注意:现在,当您需要房间id时,这会变得很棘手:)

emeijp43

emeijp432#

根据您存储日期的格式:
方案1:

r.db("myDB").table("reservations").filter(function (doc) {
    return doc("reservation_date").during(
        r.time(2018, 11, 10, 'Z'), r.time(2018, 11, 20, 'Z'));
})

方案2:

r.db("myDB").table("reservations").filter(function(doc){ 
  return doc("reservation_date").gt("2018-11-10T18:15:31.000000Z")
    .and(doc("reservation_date").lt("2018-11-20T18:15:31.000000Z"))})

提高性能的替代方法:
在预订日期创建索引:

r.db("myDB").table("reservations").indexCreate("reservation_date")

然后使用以下查询:

r.db("myDB").table('reservations')
    .between("2018-11-10T18:15:31.000000Z",
             "2018-11-20T18:15:31.000000Z", {index: "reservation_date"})

相关问题