Azure Application Insights日期差计算及查询异常问题求助
我来帮你捋捋这个问题哈,结合你描述的情况,修正后的查询没返回结果大概率是这几个原因导致的,咱们一步步排查:
虽然你测试的示例数据能正常转换,但实际日志里说不定藏着格式不统一的departureDate或logTime字符串——当todatetime()转换失败时会返回null,此时datetime_diff()的结果也是null,自然不会满足>200的筛选条件。
解决办法
可以先过滤掉无效的日期字符串,或者用parse_datetime()指定明确格式来避免自动转换的不确定性:
方案1:过滤无效日期
customEvents | where name == "SearchLog" | extend departureDateStr = tostring(customDimensions.departureDate) | extend logTimeStr = tostring(customDimensions.logTime) // 先筛掉空值或无法转换的字符串 | where isnotempty(departureDateStr) and isnotempty(logTimeStr) | extend departureDate = todatetime(departureDateStr) | extend logTime = todatetime(logTimeStr) | where datetime_diff('day', departureDate, logTime) > 200
方案2:指定日期格式(匹配你的示例数据)
customEvents | where name == "SearchLog" // 针对departureDate的MM/dd/yyyy格式指定解析规则 | extend departureDate = parse_datetime(tostring(customDimensions.departureDate), "MM/dd/yyyy") // 针对logTime的M/d/yyyy h:mm:ss tt zzz格式指定解析规则 | extend logTime = parse_datetime(tostring(customDimensions.logTime), "M/d/yyyy h:mm:ss tt zzz") | where datetime_diff('day', departureDate, logTime) > 200
你要注意datetime_diff的参数顺序:datetime_diff('<unit>', end_datetime, start_datetime),是计算结束时间减开始时间的差值。看你的示例数据:
departureDate是04/09/2020(2020-04-09)logTime是8/13/2019 8:45:39 AM -04:00(2019-08-13)
此时datetime_diff('day', departureDate, logTime)的结果是负数(因为departureDate比logTime晚),如果你的筛选条件是>200,这条符合预期的记录根本不会被选出来!
如果你的需求是departureDate和logTime的间隔超过200天,不管先后顺序,可以用绝对值:
customEvents | where name == "SearchLog" | extend departureDate = todatetime(tostring(customDimensions.departureDate)) | extend logTime = todatetime(tostring(customDimensions.logTime)) | where abs(datetime_diff('day', departureDate, logTime)) > 200
另外,你提到要“筛选出发日期距当前超330天的记录”,这和你查询里计算departureDate与logTime的差是两个不同的条件——如果是要筛选departureDate距离当前日期超过330天,应该这么写:
customEvents | where name == "SearchLog" | extend departureDate = todatetime(tostring(customDimensions.departureDate)) | where datetime_diff('day', now(), departureDate) > 330
Azure Application Insights默认只会查询最近的一小段时间(比如24小时),如果你的目标数据是更早的记录,记得手动调整查询界面顶部的时间范围(比如选“自定义范围”覆盖到你需要的时间段)。
你可以分步跑查询定位问题:
- 先看实际日志里的日期格式是否统一:
customEvents | where name == "SearchLog" | project departureDateStr = tostring(customDimensions.departureDate), logTimeStr = tostring(customDimensions.logTime) | take 20
- 查看每条记录的转换结果和差值:
customEvents | where name == "SearchLog" | extend departureDateStr = tostring(customDimensions.departureDate) | extend logTimeStr = tostring(customDimensions.logTime) | extend departureDate = todatetime(departureDateStr) | extend logTime = todatetime(logTimeStr) | extend dayDiff = datetime_diff('day', departureDate, logTime) | project departureDateStr, departureDate, logTimeStr, logTime, dayDiff | take 20
内容的提问来源于stack exchange,提问作者user3244555

