Найти среднюю разницу в датах, хранящихся в виде строк

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

Приведенный выше запрос я должен написать при весенней загрузке с 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"


person Stavros Droutsas    schedule 26.01.2019    source источник


Ответы (2)


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

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

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

person Tomas Bruckner    schedule 26.01.2019
comment
да, он находит среднюю дату, но я не могу выполнить эквивалент в весенней загрузке. Мне нужно сгруппировать по полю с именем servicerequesttype, и у меня есть критерии соответствия (дата создания больше, чем заданная строка-дата). - person Stavros Droutsas; 26.01.2019

Весенняя загрузка

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")
        );
person Stavros Droutsas    schedule 26.01.2019