elasticsearch 如何在Elastic SQL中将tick转换为datetime?

kx1ctssn  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(1)|浏览(172)

我想按月对弹性实体进行分组。为了做到这一点,我需要将Created列数据类型从ticks转换为datetime,然后使用MONTH_NAME函数提取月份,然后分组。为此,我设法创建了以下查询:

SELECT
  MONTH_NAME(CAST((Created - 621355968000000000)::double / 10000000 / 24 / 60 / 60 AS DATETIME)),
  COUNT(*)
FROM "{elastic-source}"
WHERE Created >= 638081280000000000 AND Created <= 638395776000000000
GROUP BY MONTH_NAME(CAST((Created - 621355968000000000)::double / 10000000 / 24 / 60 / 60 AS DATETIME))

这应该会给予我2023年按月份名称分组的实体计数。问题是CAST为所有实体提供了1970-01-01。我在这里遵循了Convert .NET Ticks to SQL Server DateTime的答案,但改变了我减去的刻度,因为在SQL Server中,日期从1900-01-01599266080000000000)开始,而在弹性中,它从1970-01-01621355968000000000)开始。
我还发现,在Elastic SQL中,int不能转换为datetime。我尝试了以下方法:

SELECT CAST(0 AS DATETIME)
SELECT CAST(1 AS DATETIME)
SELECT CAST(1000 AS DATETIME)

所有结果返回1970-01-01

7lrncoxx

7lrncoxx1#

问题是我除以10000000 / 24 / 60 / 60,正确的公式是只除以10,000:

SELECT
  MONTH_NAME(CAST((Created - 621355968000000000) / 10000 AS DATETIME)) as month,
  COUNT(*)
FROM "{elastic-source}"
WHERE Created >= 638081280000000000 AND Created <= 638395776000000000
GROUP BY month

关于这个
我还发现,在Elastic SQL中,int不能转换为datetime。我试过以下方法
事实证明这是不正确的。这里的问题是011000都太小了,这就是为什么它们都以1970-01-01结尾。
我使用这个网站将ticks转换为dateimehttps://tickstodatetime.azurewebsites.net/

相关问题