Найти среднюю разницу в датах, хранящихся в виде строк - PullRequest
0 голосов
/ 26 января 2019

У меня есть база данных Mongo, и я сохранил даты в виде строк. Для каждого документа у меня есть поле с именем "creationdate" и поле с именем "creationdate". Формат даты - «ГГГГ-ММ-дд» (например, «2011-12-18»). Даже я могу выполнить простое агрегирование, например, moreThan, moreThanEqual, я не могу найти разницу в датах, которую я должен найти, чтобы вычислить среднюю разницу дней между завершением и датой создания.

Приведенный выше запрос мне нужно написать при весенней загрузке с MongoTemplate, если это возможно.

Я пытаюсь что-то подобное, но это не работает.

Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("creationdate").gte(date1).lte(date2).andOperator(Criteria.where("completiondate").ne(""))),
                Aggregation.project("servicerequesttype").and(DateOperators.DateFromString.fromStringOf("completiondate").withFormat("%Y-%m-%d")).minus(DateOperators.DateFromString.fromStringOf("creationdate").withFormat("%Y-%m-%d")).as("diff"),
                Aggregation.group("servicerequesttype").avg("diff").as("average")
        );

date1, date2 - строки типа «2011-01-01»

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Spring-Boot

Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("creationdate").gte(date1).lte(date2).andOperator(Criteria.where("completiondate").ne(""))),
                Aggregation.project("servicerequesttype").and(DateOperators.DateFromString.fromStringOf("creationdate").withFormat("%Y-%m-%d")).as("creationdate").and(DateOperators.DateFromString.fromStringOf("completiondate").withFormat("%Y-%m-%d")).as("completiondate"),
                Aggregation.project("servicerequesttype").and("completiondate").minus("creationdate").as("difference"),
                Aggregation.group("servicerequesttype").first("servicerequesttype").as("servicerequesttype").avg("difference").as("temp"),
                Aggregation.project("servicerequesttype").and("temp").divide(86400000).as("average")
        );
0 голосов
/ 26 января 2019

Это то, что вы ищете?

db.collection.aggregate([
  {
    $project: {
      creationdate: {
        $dateFromString: {
          dateString: "$creationdate",
          format: "%Y-%m-%d"
        }
      },
      completiondate: {
        $dateFromString: {
          dateString: "$completiondate",
          format: "%Y-%m-%d"
        }
      }
    }
  },
  {
    $project: {
      difference: {
        $subtract: [
          "$completiondate",
          "$creationdate"
        ]
      }
    }
  },
  {
    $group: {
      _id: null,
      average: {
        $avg: "$difference"
      }
    }
  },
  {
    $project: {
      _id: 0,
      dayAverage: {
        $divide: [
          "$average",
          86400000
        ]
      }
    }
  }
])

Я создал интерактивную демонстрацию здесь: https://mongoplayground.net/p/wGRw12m3UbB

Надеюсь, это поможет:)

...