【问题标题】:Get documents between two dates获取两个日期之间的文件
【发布时间】:2022-01-22 11:02:40
【问题描述】:

在我的收藏中,我有一些文档,它们的值之一是 created_on 键,它在文档创建时由时间戳填充。

我想检索在两个日期之间创建的文档,但我无法以简单的方式获取它,我有下一个:

FOR d IN mycollection
FILTER '2021-12-01' <= DATE_FORMAT(d.created_on, "%yyyy-%mm-%dd") <= '2021-12-05'
SORT d.created_on ASC 
RETURN DATE_FORMAT(d.created_on, "%yyyy-%mm-%dd")

但是上面的查询返回所有的记录,而不仅仅是指定时间段内的文档。

有什么建议吗?提前致谢!

【问题讨论】:

  • 您的时间戳是什么样的?它们是 unix 纪元、ISO 编码的时间戳,......?
  • 如果可能的话,尝试以 unix 纪元格式存储您的时间戳,因为它们存储为整数,并且很容易执行您想要执行的查询。如果您能够以该格式存储第二个日期列,您将找到您的解决方案。
  • @mpoeter 这是时间戳方面 1634071540171

标签: arangodb aql


【解决方案1】:

问题是你的过滤器表达式'2021-12-01' &lt;= DATE_FORMAT(d.created_on, "%yyyy-%mm-%dd") &lt;= '2021-12-05' 这个基本一样

LET x = '2021-12-01' <= DATE_FORMAT(d.created_on, "%yyyy-%mm-%dd")
FILTER x <= '2021-12-05'

x 是一个布尔值,因此总是比较小于字符串。

你应该重写你的查询如下:

FOR d IN mycollection
  LET date = DATE_FORMAT(d.created_on, "%yyyy-%mm-%dd")
  FILTER '2021-12-01' <= date AND date <= '2021-12-05'
  SORT d.created_on ASC 
  RETURN DATE_FORMAT(d.created_on, "%yyyy-%mm-%dd")

这应该可以正确过滤,但是您将无法将created_an 上的任何索引用于过滤器,只能用于排序。因此,最好将查询编写如下:

LET from = DATE_TIMESTAMP('2021-12-01')
LET to = DATE_TIMESTAMP('2021-12-05')
FOR d IN mycollection
  FILTER from <= d.created_on AND d.created_on <= to
  SORT d.created_on ASC 
  RETURN DATE_FORMAT(d.created_on, "%yyyy-%mm-%dd")

【讨论】:

  • 谢谢,我尝试像在 python 上一样应用链比较,但我发现我需要以分开的方式进行两次比较
猜你喜欢
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2019-06-22
  • 2012-03-24
  • 2010-10-05
  • 2017-06-03
相关资源
最近更新 更多