如何在ElasticSearch中计算两个datetime之间的差异

h9a6wy2h  于 7个月前  发布在  ElasticSearch
关注(0)|答案(3)|浏览(90)

我正在使用ES,我需要一个查询,返回两个日期时间(mysql timediff)之间的差异,但没有找到任何ES函数来做这件事。有人可以帮助我吗?
MySQL query:

SELECT SEC_TO_TIME(
    AVG(
      TIME_TO_SEC(
        TIMEDIFF(r.acctstoptime,r.acctstarttime)
      )
    )
) as average_access
    
FROM radacct

字符串

ldxq2e6h

ldxq2e6h1#

如果您启用了动态脚本,并且这些日期字段在Map中定义为日期,那么上面的搜索查询应该可以工作。

{
  "script_fields": {
    "test1": {
      "script": "doc['acctstoptime'].value - doc['acctstarttime'].value"
    }
  }
}

字符串
请注意,你将得到的结果在历元,你需要转换为您的面额。
您可以在这里阅读有关scripted field的内容以及它的一些示例here

qmb5sa22

qmb5sa222#

下面是另一个使用脚本字段的例子。它将日期转换为自epoch以来的毫秒,减去两者并将结果转换为两个日期之间的天数。

{
"query": {
    "bool": {
    "must": [
        {
        "exists": {
            "field": "priorTransactionDate"
        }
        },
        {
        "script": {
            "script": "(doc['transactionDate'].date.millis - doc['priorTransactionDate'].date.millis)/1000/86400 < 365"
        }
        }
    ]
    }
}
}

字符串

6g8kf2rb

6g8kf2rb3#

脚本字段工作,但不幸的是,接受的答案不适合我在2023年与弹性8.10.经过大量的尝试,我来了以下工作:

GET yourcustomindex/_search
{
  "script_fields": {
    "duration": {
      "script": {
        "source": "doc['endDate'].getValue().toEpochSecond() - doc['startDate'].getValue().toEpochSecond()"
      }
    }
  }
}

字符串
记住toEpochSecondtoEpochSecond*s*的对比,你也可以在一些答案中找到,但是它似乎也过时了。

相关问题