Azure Log Analytics中解析IntuneDevices表CreatedDate字符串提取日期的正则表达式问题
解决Kusto中IntuneDevices表CreatedDate日期提取问题
嘿,我来帮你搞定这个Kusto里的日期提取问题!你的核心需求是从2021-05-17 07:33:41.0000000这种格式的字符串里提取日期部分,其实有好几种简单的方法,先给你最直接的解决方案:
1. 最简单高效:用substring直接截取
因为你的CreatedDate格式是固定的YYYY-MM-DD开头,前10个字符正好是日期部分,直接截取就行,完全不用正则:
IntuneDevices | where TimeGenerated > ago(1d) | extend CreatedDateOnly = substring(CreatedDate, 0, 10) | project TimeGenerated, CreatedDate, now(), CreatedDateOnly
2. 用parse函数修正正则逻辑
你之前的parse语句问题出在正则的匹配顺序上,应该让正则先捕获日期部分,再忽略后面的内容。试试这个:
IntuneDevices | where TimeGenerated > ago(1d) | parse kind=regex CreatedDate with CreatedDateOnly '\\s.*' // 匹配第一个空格前的所有内容(就是日期) | project TimeGenerated, CreatedDate, now(), CreatedDateOnly
如果想要更精确匹配日期格式,也可以写完整的正则:
IntuneDevices | where TimeGenerated > ago(1d) | parse kind=regex CreatedDate with '(\\d{4}-\\d{2}-\\d{2})\\s.*' CreatedDateOnly | project TimeGenerated, CreatedDate, now(), CreatedDateOnly
3. 用extract函数正确匹配
你之前测试extract时,正则写的是找带方括号的日期,但你的实际CreatedDate没有方括号,所以匹配不到。调整正则去掉方括号就行:
IntuneDevices | where TimeGenerated > ago(1d) | extend CreatedDateOnly = extract(@'(\\d{4}-\\d{2}-\\d{2})', 1, CreatedDate) | project TimeGenerated, CreatedDate, now(), CreatedDateOnly
为什么你之前的尝试失败了?
- 第一次
parse用了"(\\d\\d\\d\\d[-]\\d\\d[-]\\d\\d)*",这里的*表示匹配0或多次,而且没处理后面的内容,导致Kusto误匹配了时间部分的数字。 - 第二次
parse里的*是贪婪匹配,会吃掉前面所有内容,然后反向找符合正则的字符串,自然抓到了后面的时间部分。 - 你的
extract测试案例里,正则带了方括号\[...\],但实际数据没有方括号,所以完全匹配不到,返回空。
额外加分项:直接转成日期类型对比
既然你最终要和now()比较,其实不用只提取日期,直接把CreatedDate转成datetime类型更方便,Kusto的todatetime能自动识别这种格式:
IntuneDevices | where TimeGenerated > ago(1d) | extend CreatedDateTime = todatetime(CreatedDate) | where CreatedDateTime > ago(30d) // 示例:筛选30天内创建的设备 | project TimeGenerated, CreatedDate, CreatedDateTime, now()
内容的提问来源于stack exchange,提问作者DeLastOne
相关产品推荐
相关产品推荐

