首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用SQL测试5分钟间隔,在AWS雅典娜中给定Windows事件管理器事件时间戳

如何使用SQL测试5分钟间隔,在AWS雅典娜中给定Windows事件管理器事件时间戳
EN

Stack Overflow用户
提问于 2019-04-10 14:53:18
回答 2查看 2K关注 0票数 1

我使用AWS中的Athena和Windows事件管理器日志来构造一些安全事件查询。其中之一是,我想在5分钟内查询报告3次或3次以上失败登录尝试的机器。

时间戳列的格式如下:2019-03-25T19:18:10.7954381Z

我已经用特定的事件id:SELECT machinename, COUNT(eventid) FROM windows WHERE eventid = 4625 GROUP BY machinename HAVING COUNT(eventid = 4625) >= 3;完成了查找机器。

它只是为任何时间戳返回所有事件It大于或等于3的机器。

我的问题是:如何在SQL中实现逻辑,以检查该特定事件I是否在5分钟的时间范围内发生,而不是只显示所有时间?

这是我对SQL的第一次尝试;任何帮助都是非常感谢的。谢谢!

编辑:西奥有解决方案。在此张贴:

SELECT FROM_UNIXTIME( FLOOR( TO_UNIXTIME( DATE_PARSE(substr(timecreated, 1, 16), '%Y-%m-%dT%H:%i') )/300 ) * 300 ) AS five_minute_window, machine-name, COUNT(event-id) AS event_count FROM table WHERE event-id = 4625 GROUP BY 1, machine-name HAVING COUNT(event-id = 4625) >= 3;

我不得不刮掉小数秒,因为有一些不正常的时间戳没有格式化(只有整秒钟)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-11 18:26:27

在雅典娜中,您可以使用DATE_TRUNC函数将时间戳截断为整分钟、小时等。不幸的是,它不支持单位的倍数,因此五分钟是不可能的。

我通常是这样做的:FROM_UNIXTIME(FLOOR(TO_UNIXTIME("timestamp")/300) * 300)。它把它转换成UNIX时间戳,即自1970年以来的秒数,除以300,得到自1970年以来每隔5分钟的时间,然后将其舍入整数,然后再乘以300,将其转换为秒,然后再将其转换为时间戳。这适用于任何间隔,只需改变300到1800轮到半个小时,等等。

雅典娜不支持时间戳格式,所以您需要解析它,这是用DATE_PARSE完成的,例如DATE_PARSE("timestamp_column", '%Y-%m-%dT%H:%M:%S.%fZ')

完整的示例可能如下所示:

代码语言:javascript
运行
复制
SELECT
  FROM_UNIXTIME(
    FLOOR(
      TO_UNIXTIME(
        DATE_PARSE("timestamp_column", '%Y-%m-%dT%H:%M:%S.%fZ')
      )/300
    ) * 300
  ) AS five_minute_window,
  COUNT(*) AS event_count
FROM some_table
GROUP BY 1

这将给出每5分钟窗口中的行数。您可以添加一个WHERE来筛选特定行,并添加外部查询来查找具有许多事件的窗口,等等。

票数 3
EN

Stack Overflow用户

发布于 2019-04-10 15:51:46

所以你想在n分钟内转一圈,对吧?我把oracle语法放在下面,但请注意,所有数据库都有类似的功能。方法是在这一分钟“舍入”或“截断”数据。现在是10点43分-10点40分。一旦你得到它,你就可以按它来分组了。

  • oracle中的sysdate返回当前日期/测试时间。
  • to_char转换给定格式的日期或数字
  • 使用trunc (或圆形)截断数字操作。
  • to_date是将格式的字符串转换为日期。
代码语言:javascript
运行
复制
select actual_date,
       to_date(to_char(actual_date,'YYYYMMDDHH24') || min_trunc_5,'YYYYMMDDHH24MI') rouded_to_5_dt,
       min_trunc_5
from
(
    select sysdate  actual_date, 
           ltrim(to_char(trunc(to_number(to_char(sysdate,'MI')/5))*5,'09')) min_trunc_5
    from dual
) x

它回来找我了

代码语言:javascript
运行
复制
actual_date      rounded_to_5_dt min_trunc_5
20190410084837   20190410084500  45

看看48岁到45岁。现在,如果对任何日期和组进行这种类型的操作,我将对5分钟范围内的所有数据进行分组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55615611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档