ArangoDB日期数学 - 月差异

时间:2016-08-31 20:41:25

标签: date arangodb aql

利用AQL中的DATE_SUBTRACT函数,当处理月末附近的日期时,Arango似乎减去30天而不是返回实际的前一个月。 e.g:

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

正如你所看到的,这会使7月两次,5月两次,3月两次,12月两次和10月两次返回。

我实际上只需要前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个。

1 个答案:

答案 0 :(得分: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"
]

我会这是一个更简单的解决方案,所以如果有的话请告诉我。所有这些功能都是一堆开销。