我想按月对弹性实体进行分组。为了做到这一点,我需要将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-01
(599266080000000000
)开始,而在弹性中,它从1970-01-01
(621355968000000000
)开始。
我还发现,在Elastic SQL中,int
不能转换为datetime
。我尝试了以下方法:
SELECT CAST(0 AS DATETIME)
SELECT CAST(1 AS DATETIME)
SELECT CAST(1000 AS DATETIME)
所有结果返回1970-01-01
。
1条答案
按热度按时间7lrncoxx1#
问题是我除以
10000000 / 24 / 60 / 60
,正确的公式是只除以10,000:关于这个
我还发现,在Elastic SQL中,int不能转换为datetime。我试过以下方法
事实证明这是不正确的。这里的问题是
0
,1
和1000
都太小了,这就是为什么它们都以1970-01-01
结尾。我使用这个网站将ticks转换为
dateime
:https://tickstodatetime.azurewebsites.net/