2016-08-31 4 views
0

Mit der Funktion DATE_SUBTRACT in AQL scheint Arango bei der Verarbeitung von Terminen gegen Ende des Monats 30 Tage zu subtrahieren, anstatt den tatsächlichen vorherigen Monat zurückzugeben. z.B .:ArangoDB Date Math - Monatsunterschied

for mo in 0..11 
    let month = date_subtract(date_now(),count,"month") 
    return month 

kehrt

[ 
    "2016-08-31T20:30:24.440Z", 
    "2016-07-31T20:30:24.441Z", 
    "2016-07-01T20:30:24.441Z", 
    "2016-05-31T20:30:24.441Z", 
    "2016-05-01T20:30:24.441Z", 
    "2016-03-31T20:30:24.441Z", 
    "2016-03-02T20:30:24.441Z", 
    "2016-01-31T20:30:24.441Z", 
    "2015-12-31T20:30:24.441Z", 
    "2015-12-01T20:30:24.441Z", 
    "2015-10-31T20:30:24.441Z", 
    "2015-10-01T20:30:24.441Z" 
] 

Wie Sie sehen können, gibt diese zweimal Juli Mai zweimal, zweimal März zweimal Dezember und zweimal Oktober.

Ich brauche eigentlich nur die vorherigen 12 Monate. Die Liste Ich mag würde, ist:

[ 
    "2016-08-01T00:00:00.000Z", 
    "2016-07-01T00:00:00.000Z", 
    "2016-06-01T00:00:00.000Z", 
    "2016-05-01T00:00:00.000Z", 
    "2016-04-01T00:00:00.000Z", 
    "2016-03-01T00:00:00.000Z", 
    "2016-02-01T00:00:00.000Z", 
    "2016-01-01T00:00:00.000Z", 
    "2015-12-01T00:00:00.000Z", 
    "2015-11-01T00:00:00.000Z", 
    "2015-10-01T00:00:00.000Z", 
    "2015-09-01T00:00:00.000Z" 
] 

Wie in AQL konnte ich sicher, ich immer den aktuellen Vormonats bekommen, anstatt einfach 30 Tage in der Vergangenheit? Ich befürchte, dass die date_subtract Funktion keine Schaltjahre oder 31sts behandelt.

Antwort

1

Es ist hacky, aber ich schaffte es zu erreichen, was ich war, nachdem mit diesem:

for mo in 0..11 
    return date_subtract(concat(left(date_iso8601(date_now()),7),'-01T00:00:00.000Z'), mo, "month") 

in Resultierende:

[ 
    "2016-08-01T00:00:00.000Z", 
    "2016-07-01T00:00:00.000Z", 
    "2016-06-01T00:00:00.000Z", 
    "2016-05-01T00:00:00.000Z", 
    "2016-04-01T00:00:00.000Z", 
    "2016-03-01T00:00:00.000Z", 
    "2016-02-01T00:00:00.000Z", 
    "2016-01-01T00:00:00.000Z", 
    "2015-12-01T00:00:00.000Z", 
    "2015-11-01T00:00:00.000Z", 
    "2015-10-01T00:00:00.000Z", 
    "2015-09-01T00:00:00.000Z" 
] 

Ich würde Liebe eine einfachere Lösung dieses Problems, so lassen Sie es Ich weiß, ob es einen gibt. All diese Funktionen sind ein Haufen Overhead.

+0

JavaScript wird verwendet, um Daten hinter den Kulissen zu berechnen, und wenn Sie einen Monat hinzufügen, ändert sich der Tag. Ob dies gut oder schlecht ist, hängt vom Anwendungsfall IMO ab. Der Nachteil, nur die Monatszahl (und das Jahr bei Über-/Unterlauf) zu ändern, wäre, dass mehrere Tage am Ende einiger Monate auf den letzten Tag eines anderen Monats, z. 2017-01-28 bis 2017-01-31 bis 2017-02-28. Andersherum ist es noch komplizierter - sollte 28. Februar Karte zu Jan/28. März oder 31.? Oder etwas dazwischen? – CoDEmanX

+0

Es ist sehr verwirrend - für meine Zwecke möchte ich definitiv die Subtraktion eines Monats für den vorherigen Monat, nicht für den gleichen Monat oder einen Monat überspringen. Sehr selten interessiert mich, was am "heutigen Datum, letzten Monat" passiert ist, aber ich sorge mich sehr darum, Daten monatlich zu aggregieren. Meine obige Lösung funktioniert, aber ich hätte wirklich gerne eine zuverlässige In-Database-Funktion, die das leistet. –