Elastic SQL中ticks转datetime失败,分组统计月份异常求助
解决Elastic SQL中Ticks转Datetime并按月份分组统计的问题
问题原因分析
核心问题是对Elastic SQL中DATETIME类型的转换规则理解有误:
- Elastic SQL要求
CAST(数值 AS DATETIME)的输入是Unix毫秒级时间戳(从1970-01-01 UTC开始计算的毫秒数)。 - 你之前的转换逻辑把Ticks转成了秒数,数值量级太小,所以全部被解析为1970-01-01。
- .NET Ticks(100纳秒为单位)转Unix毫秒时间戳的正确公式是:
(Ticks值 - 621355968000000000) / 10000——其中621355968000000000是1970-01-01对应的.NET Ticks,除以10000是因为1毫秒=10000个Ticks(1 Tick=100纳秒)。
修正后的查询语句
调整转换逻辑为正确的毫秒级时间戳计算,同时用别名简化分组语句:
SELECT MONTH_NAME(CAST((Created - 621355968000000000) / 10000 AS DATETIME)) AS month_name, COUNT(*) AS entity_count FROM "{elastic-source}" WHERE Created >= 638081280000000000 AND Created <= 638395776000000000 GROUP BY month_name ORDER BY month_name
补充说明
- 你测试的
CAST(0 AS DATETIME)等语句返回1970-01-01是正常的:0对应Unix时间戳起始点,1对应1970-01-01 00:00:00.001,1000对应00:00:01,只是Elastic SQL默认只显示日期部分,所以看起来都是同一天。 - 若需要更精确的时间显示,可使用
FORMAT_DATETIME函数指定格式,比如FORMAT_DATETIME(CAST(...) AS DATETIME, 'yyyy-MM-dd HH:mm:ss')。
内容的提问来源于stack exchange,提问作者Marin Takanov
相关产品推荐
相关产品推荐

