Найти среднюю разницу в датах, хранящихся в виде строк
У меня есть база данных 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 ответа
Это то, что вы ищите?
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
Надеюсь, поможет:)
Весна-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")
);