【问题标题】:ArangoDB IS_DATE AQL FunctionArangoDB IS_DATE AQL 函数
【发布时间】:2015-12-04 18:34:35
【问题描述】:

我在一个集合中有许多项目,它们都有一个 dateDue 字段。有些将此 dateDue 字段设置为 ISO8601 日期,有些则为 null,而另一些则为空字符串。我想做以下事情:

filter DATE_COMPARE(DATE_NOW(), dateDue, "years", "days")

但是,如果 dateDue 为 null 或空白字符串,则会引发错误。我可以添加这个来解决它:

filter w.dateDue != null and w.dateDue != ""
filter DATE_COMPARE(DATE_NOW(), dateDue, "years", "days")

但这仅涵盖空值和空白字符串。当然这可能就足够了,但我想确保排除任何没有 dateDue 字段有效日期的记录。我期待看到 Arango 的 IS_DATE 函数,但我在手册中的任何地方都找不到。有什么想法吗?

【问题讨论】:

  • DATE_TIMESTAMP 不会抛出无效的 iso8601 日期,而是返回 null 并给出警告:return DATE_TIMESTAMP("2015-50-04T04:44:42.505Z") != null 另一种方法可能是编写自定义 aql 函数 isNaN(new Date("2015-50-04T04:44:42.505Z")) 我不确定是否存在更好的方法

标签: validation date arangodb


【解决方案1】:

AQL 中目前没有IS_DATE 函数或类似功能,因此使用上述过滤器绝对是一种方法。

为了以后更容易,今天在 2.8 分支中添加了 IS_DATESTRING AQL 函数。这将允许按如下方式编写过滤器:

FILTER IS_DATESTRING(w.dateDue)
FILTER DATE_COMPARE(DATE_NOW(), w.dateDue, "years", "days")

【讨论】:

  • 太好了,我期待 IS_DATESTRING 功能!
  • 另外,我注意到 momentjs 的标准 ISO8601 格式(一个非常流行的 javascript 日期库)似乎与 Arango 中的 ISO8601 格式不能很好地混合。例如:
  • DATE_FORMAT("2015-12-18T18:40:48-06:00", "%yyyy-%mm-%dd") == "2015-12-19"
  • 不确定您的意思以及不匹配的位置:DATE_FORMAT("2015-12-18T18:40:48-06:00", "%yyyy-%mm-%dd") 确实返回了字符串2015-12-19,这是预期的。结果似乎也正确,因为 new Date("2015-12-18T18:40:48-06:00").toISOString() 等于 UTC 2015-12-19T00:40:48.000Z,并且 ArangoDB 中的所有日期值都适用于 UTC。
  • 嗯...我不能完全理解日期值。为什么 2015-12-19 是 DATE_FORMAT("2015-12-18T18:40:48-06:00", "%yyyy-%mm-%dd") 的期望值?字符串的日期部分是“2015-12-18...”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多