jq按日期过滤json

时间:2016-10-05 18:59:44

标签: json jq

我有一些看起来像这样的json

 {
  "users":[ {  
     "id":8734,
     "last_login":"2016-10-04T06:59:40Z"
  },
  {  
    "id":9376,
    "last_login":"2016-05-04T20:37:32Z"
  },
  {  
    "id":9376,
    "last_login":null
  }
]}

我想返回上次登录日期为>的ID 90天所以在这种情况下它应该只返回9376.我在想我需要将fromdateiso8601与select结合使用,但是在使用语法时遇到一些麻烦。

这似乎有效

.users[] | select ( .last_login | fromdateiso8601 > 1475625600) | .id 

但我还是得到了

jq: error (at <stdin>:0): strptime/1 requires string inputs and arguments

如何处理null,理想情况下,这些将包含在结果中。

2 个答案:

答案 0 :(得分:3)

只需添加适当的空检查。

.users[] | select (.last_login | . == null or fromdateiso8601 > 1475625600).id 

答案 1 :(得分:1)

防止.last_login空值的一种方法如下:

.users[]
| select ( .last_login // empty | fromdateiso8601 > 1475625600)
| .id 

为清楚起见,我添加了括号,例如:

.users[]
| select ( (.last_login // empty) | fromdateiso8601 > 1475625600)
| .id 

或者更具防御性,请使用?

.users[]
| select ( .last_login | fromdateiso8601? > 1475625600)
| .id 

如果要包含.last_login评估为null的项目,那么您可以使用Jeff建议的过滤器,或者可能:

 (.last_login | fromdateiso8601? > 1475625600) // true

P.S。对于&#34;之前90天,以Unix纪元开始后的秒数表示&#34;,您可以使用:

def daysAgo(days):  (now | floor) - (days * 86400);