如何查询ISO日期为今天的对象?

时间:2017-04-21 10:20:57

标签: typescript elasticsearch firebase-realtime-database

我有这些数据:

[
  ...
  {
      date: {
        startDate: '2017-04-21T00:00:00.000Z',
        endDate: '2017-04-21T00:00:00.000Z',
        startTime: '12:00',
        endTime: '21:00'
      }
    },
    {
      date: {
        startDate: '2017-04-21T00:00:00.000Z',
        endDate: '2017-04-21T00:00:00.000Z',
        startTime: '09:00',
        endTime: '23:00'
      }
    }
  ...
]

这是我到目前为止所做的:

export const OngoingEventsQuery: any = {
  type: 'event',
  body: {
    from: 0,
    size: 2,
    query: {
      range: {
        'date.startDate': {
          gt: new Date().getDate() - 1
        },
        'date.endDate': {
          lt: new Date().getDate() + 1
        }
      }
    }
  }
};

现在我需要做的是匹配与今天相匹配的对象,并考虑startTimeendDate。因此,如果今天的日期为april 21 2017且时间为15:00,则上述两个对象都应匹配。

首先尝试没有开始和结束时间匹配,这个查询给了我数据库中的每个可能的对象,这是非常错误的。

我认为我必须在yesterdaytomorrow之间设置一个日期才能获得today,使用getDate()加一或减一。但这显然是错误的。

我该怎么做?

编辑:奇怪的是,如果我从查询中删除fromsize,我会得到0结果..

2 个答案:

答案 0 :(得分:2)

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "date.startDate": {
              "gte": "now/d",
              "lte": "now/d"
            }
          }
        },
        {
          "range": {
            "date.endDate": {
              "gte": "now/d",
              "lte": "now/d"
            }
          }
        }
      ]
    }
  }
}

the documentation起,日期在内部以UTC格式保存,因此,如果您的比较将使用UTC时间,那么您应该好好去:

  

在内部,日期转换为UTC(如果指定了时区)并存储为一个长数字,表示自此纪元以来的毫秒数。

答案 1 :(得分:0)

只是建立@ AndreiStefan的答案,包括时间就像添加两个range条件一样简单。因此完整查询如下所示:

export const OngoingEventsQuery: any = {
  type: 'event',
  body: {
    from: 0,
    size: 2,
    query: {
      bool: {
        must: [
          {
            range: {
              'date.startDate': {
                gte: 'now/d',
                lte: 'now/d'
              }
            }
          },
          {
            range: {
              'date.endDate': {
                gte: 'now/d',
                lte: 'now/d'
              }
            }
          },
          {
            range: {
              'date.startTime': {
                lte: datefns.getHours(new Date()) + ':' + datefns.getMinutes(new Date())
              }
            }
          },
          {
            range: {
              'date.endTime': {
                gte: datefns.getHours(new Date()) + ':' + datefns.getMinutes(new Date())
              }
            }
          }
        ]
      }
    }
  }
};

然而,这还没有考虑时区。