Berechnen Sie den Datumsunterschied in Jahr, Monat, Tag

8

Ich habe die folgende Frage:

%Vor%

Das obige Abfrageergebnis lautet:

%Vor%

Aber ich möchte seine Dauer in year + month + day format bekommen, etwa so: 2 y, 3 m, 20 d . Ein weiterer Punkt, wenn ein Kurs läuft, ist das to -Feld null und ein anderes Feld isGoingOn: true , also sollte ich hier die Dauer berechnen, indem ich das aktuelle Datum anstelle von to -Feld verwende. Und Benutzer hat Array von natürlich Filialdokumenten

%Vor%

Ein anderer Punkt ist dies: Dieses Datum kann in einem Filialdokument zu dem anderen Filialdokument nicht kontinuierlich sein. Ein Benutzer kann einen Kurs für 1 Jahr haben, und dann nach 2 Jahren, er / sie begann seinen / ihren nächsten Kurs für 1 Jahr und 3 Monate (es bedeutet, dass dieser Benutzer insgesamt 2 Jahre und 3 Monate Kursdauer hat) . Was ich will, ist, Datum Unterschied jedes Filialdokument in Ausbildungen Array zu bekommen, und summiere diese. Angenommen, in meinen Beispieldaten Java Kursdauer ist 6 Monate und 22 Tage, PHP Kursdauer ist 1 Jahr und 6 Monate und 22 Tage, und die letzte ist vom 8 Feb 2017 bis jetzt, und es wird auf, so ist meine Bildungsdauer die Summe dieser Intervalle.

    
jones 11.11.2017, 09:23
quelle

3 Antworten

3

Bitte versuchen Sie diese Aggregation, um einen Datumsunterschied in Tagen, Monaten und Jahren zu erhalten, fügen Sie multiple $addFields stage compute hinzu und reduzieren Sie die Differenzen auf Datum, Monatsbereich ohne Unterlauf, und die Annahme ist hier 1 Monat = 30 Tage

Pipeline

%Vor%

Ergebnis

%Vor%     
Saravana 18.02.2018, 11:06
quelle
0

Nun, Sie könnten einfach einfach den vorhandenen Datumsaggregationsoperator verwenden, anstatt ihn zu verwenden mathe, um in "Tage" umzuwandeln, wie Sie jetzt haben:

%Vor%

Es ist "irgendwie" eine Annäherung an die "Tage" und "Monate" ohne die notwendigen Operationen, um "sicher" von Schaltjahren zu sein, aber es würde Ihnen das Ergebnis bringen, das für die meisten Zwecke "nahe genug" sein sollte .

Sie können dies auch ohne $unwind tun, solange Ihre MongoDB-Version dies ist 3.2 oder höher:

%Vor%

Dies liegt daran, dass Sie von MongoDB 3.4 aus $sum direkt mit einem Array verwenden können oder einer Liste von Ausdrücken in Stufen wie $addFields oder $project und die $map kann dieselben" date aggregation operator "-Ausdrücke für jedes Array-Element anwenden anstelle von $unwind zuerst.

So kann die Hauptmathematik wirklich in einem Teil des "Reduzierens" des Arrays gemacht werden, und dann kann jede Summe durch die allgemeinen "Teiler" für die Jahre angepasst werden, und der "Modulo" oder "Rest" von irgendwelchen Überläufen in den Monaten und Tagen.

Im Wesentlichen zurück:

%Vor%

Gegeben am 11. November 2017

    
Neil Lunn 11.11.2017 09:43
quelle
0

Sie können Ihren Code vereinfachen, indem Sie die clientseitige Verarbeitung mit moment js Bibliothek verwenden.

Die gesamte Datumszeit wird von Moment js library verarbeitet. Verwenden Sie duration , um die verkürzte Zeit zu berechnen. diff

Verwenden Sie reduce, um die Zeitdifferenz über alle Array-Elemente hinzuzufügen, gefolgt von der Momentdauer, um die Zeit in Jahren / Monaten / Tagen auszugeben.

Es löst zwei Probleme:

  1. Gibt Ihnen einen genauen Unterschied in den Monaten und Tagen zwischen zwei Daten.
  2. Gibt das erwartete Format.

Zum Beispiel:

%Vor%

MongoDb-Integration:

%Vor%     
Veeram 20.02.2018 04:54
quelle