ArangoDB Date Math — разница в месяце

Используя функцию DATE_SUBTRACT в AQL, при обработке дат ближе к концу месяца Arango, кажется, вычитает 30 дней вместо того, чтобы возвращать фактический предыдущий месяц. например.:

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

возвращается

[
  "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"
]

Как видите, это возвращает дважды июль, дважды май, дважды март, дважды декабрь и дважды октябрь.

На самом деле мне просто нужны предыдущие 12 месяцев. Список, который я хотел бы:

[
  "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"
]

Как в AQL я могу убедиться, что всегда получаю фактический предыдущий месяц, а не просто 30 дней в прошлом? Я боюсь, что функция date_subtract не будет обрабатывать високосные или 31-е годы.


person Nate Gardner    schedule 31.08.2016    source источник


Ответы (1)


Это взломано, но мне удалось выполнить то, что я хотел, с помощью этого:

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

В результате чего:

[
  "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"
]

Мне хотелось бы найти более простое решение, поэтому, пожалуйста, дайте мне знать, если оно есть. Все эти функции — куча накладных расходов.

person Nate Gardner    schedule 31.08.2016
comment
JavaScript используется для расчета дат за кадром, и если вы добавите туда месяц, день изменится. Хорошо это или плохо, зависит от варианта использования IMO. Недостатком изменения только номера месяца (и года при переполнении/переполнении) будет то, что несколько дней в конце некоторых месяцев будут отображаться в последний день другого месяца, например. с 28 января 2017 г. по 31 января 2017 г. по 28 февраля 2017 г. Наоборот, это еще сложнее — должно ли 28 февраля сопоставляться с 28 или 31 января/марта? Или что-то среднее? - person CodeManX; 05.10.2016
comment
Это очень сбивает с толку - для моих целей я определенно хочу, чтобы вычитание месяца отображалось за предыдущий месяц, а не за тот же месяц или пропущенный месяц. Очень редко меня волнует, что произошло сегодня, в прошлом месяце, но меня очень волнует сбор данных за месяц. Мое вышеприведенное решение работает, но я действительно хотел бы иметь надежную функцию в базе данных, которая выполняет это. - person Nate Gardner; 06.10.2016