KQL中datetime与long类型unix时间戳bin周分桶结果不一致问题
问题根因
两种分桶写法结果不一致,核心是bin()函数对不同数据类型的默认对齐锚点规则不同:
- 对
long类型数值分桶时,固定以数值0为对齐起点,对应毫秒级Unix时间戳的锚点就是1970-01-01T00:00:00.000Z,所有桶边界均从该时间点累加固定步长计算 - 对
datetime类型做时间分桶时,默认锚点不是Unix纪元零点,按周粒度分桶时的默认对齐边界和long类型规则不匹配,最终导致分桶结果出现差异
解决方法
无需做冗余的类型转换,直接给datetime类型调用的bin()函数传入第三个参数,显式指定对齐锚点为Unix纪元零点,即可让datetime类型的分桶逻辑和long类型完全一致。
修正后的查询语句:
let fooTable = datatable(ts: long) [ 1655139949044, 1655053767530, ]; let bucket_ts = 1m * 10080; let unix_epoch_anchor = datetime(1970-01-01); fooTable | summarize count() by bin(unixtime_milliseconds_todatetime(ts), bucket_ts, unix_epoch_anchor)
上述语句执行后会返回1行聚合结果,和直接对long类型分桶的预期结果完全一致。
补充说明
- 任意时间粒度的datetime分桶,如果需要和Unix时间戳数值分桶逻辑对齐,都可以通过传入
datetime(1970-01-01)作为锚点参数实现,无需额外做类型转换 - 该锚点参数支持自定义任意datetime值,可灵活适配不同的分桶对齐需求,比如按周一为周起点、按指定业务日期为分桶起点等场景,都可以通过修改锚点值实现
内容的提问来源于stack exchange,提问作者sheldonzy
相关产品推荐
相关产品推荐

