如何使用Kusto筛选每日18:00至次日6:00时段的SignInLogs日志
Kusto实现不限制具体日期、按每日固定时段筛选日志
你要实现的每日18:00到次日6:00的跨天时段筛选,不需要绑定具体日期值,直接提取时间戳的当日时间维度字段做判断即可,不需要写死年月日。
整小时精度最简写法
如果筛选精度只需要到整小时,直接用内置的hourofday()函数即可,写法如下:
SignInLogs // 先限定查询的大时间范围,避免扫描全量历史数据提升查询效率,可根据需求自行调整范围 | where TimeGenerated between(ago(30d) .. now()) // 筛选每日18点(含)到次日6点(不含)的记录 | where hourofday(TimeGenerated) >= 18 or hourofday(TimeGenerated) < 6
hourofday()会返回时间戳对应当日的小时数值,取值范围为0-23的整数,返回值和年、月、日字段完全无关,正好匹配只按每日时间维度过滤的需求。- 跨天时段的判断逻辑拆成两部分:当日18点到24点的记录满足
小时>=18,次日0点到6点的记录满足小时<6,两个条件满足任意一个即可。
精确到分/秒的通用写法
如果需要卡更细的时间粒度,比如要精确到分、秒,或者需要配置非整小时的时段(比如18:15到次日6:20),可以把时间戳转换成当日0点起累计的秒数再做阈值比对:
SignInLogs | where TimeGenerated between(ago(30d) .. now()) // 计算当前时间是当日的第几秒 | extend dayTotalSeconds = datetime_part("hour", TimeGenerated)*3600 + datetime_part("minute", TimeGenerated)*60 + datetime_part("second", TimeGenerated) // 18:00对应累计秒数为18*3600=64800,6:00对应累计秒数为6*3600=21600 | where dayTotalSeconds >= 64800 or dayTotalSeconds < 21600
注意:以上写法默认基于
TimeGenerated字段自带的时区计算,如果你的日志存的是UTC时间,需要按本地时区筛选,可以先用datetime_utc_to_local()做时区转换,比如按北京时间计算就把判断部分改成hourofday(datetime_utc_to_local(TimeGenerated, "Asia/Shanghai"))。
内容的提问来源于stack exchange,提问作者Gill-Bates
相关产品推荐
相关产品推荐

