如何在Azure Sentinel的KQL查询中筛选多个非连续节假日时段?
解决Azure Sentinel KQL筛选非连续假日日期的问题
问题根源
你之前的写法有两个核心问题:
- 用
string类型存储假日日期,和TimeGenerated(datetime类型)直接用!contains匹配逻辑错误——contains是子串匹配,既不适合日期等值判断,也不能直接把整个表作为参数。 - 你要匹配的是日期维度(不管具体时间点),但没对
TimeGenerated做日期提取,导致无法和假日日期做精准匹配。
方案一:用in运算符快速筛选
直接把假日日期定义为datetime数组,提取TimeGenerated的日期部分后,用in判断是否在假日列表里,适合假日数量不多的场景:
// 定义假日日期数组(直接用datetime类型,避免字符串转换问题) let HolidayDates = dynamic([ datetime(2022-12-24), datetime(2022-12-25), datetime(2023-01-01), datetime(2023-01-02), datetime(2023-01-03), datetime(2023-04-07), datetime(2023-04-08), datetime(2023-04-09), datetime(2023-04-10) ]); // 替换成你的实际日志表名,提取日期后筛选 YourLogTable | where startofday(TimeGenerated) in (HolidayDates)
startofday()会把TimeGenerated转换成当天零点的datetime值,确保只要是假日当天的日志都会被匹配到。
方案二:用datatable配合join(适合需维护的场景)
如果假日日期需要分组注释、后续频繁更新,用datatable定义更清晰,再通过join关联筛选:
let HolidayDates = datatable(HDates: datetime) [ datetime(2022-12-24), // 圣诞假期 datetime(2022-12-25), datetime(2023-01-01), // 新年假期 datetime(2023-01-02), datetime(2023-01-03), datetime(2023-04-07), // 复活节假期 datetime(2023-04-08), datetime(2023-04-09), datetime(2023-04-10) ]; // 提取日志日期,和假日表做内连接筛选 YourLogTable | extend LogDate = startofday(TimeGenerated) | join kind=inner (HolidayDates) on $left.LogDate == $right.HDates | project-away LogDate, HDates // 移除临时字段
补充:排除假日日期的写法
如果需要筛选非假日的记录,只需调整判断逻辑:
- 用
!in替代in:where startofday(TimeGenerated) !in (HolidayDates) - 或用
leftantijoin:join kind=leftanti (HolidayDates) on $left.LogDate == $right.HDates
内容的提问来源于stack exchange,提问作者Stuart
相关产品推荐
相关产品推荐

