You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ClickHouse 22.3.15中将公历转波斯历报错,需按波斯历月聚合求和

解决ClickHouse按波斯历(Jalali历)月份聚合求和的问题

报错原因

你遇到的ILLEGAL_TYPE_OF_ARGUMENT错误,是因为ClickHouse 22.3版本的format函数第一个参数要求为DateTime类型,但你的created_date字段是Date类型,类型不匹配导致报错。

解决方案

要实现按波斯历月份统计求和,需要先将Date类型转换为DateTime类型,再结合波斯历locale处理日期,最后分组聚合。以下提供两种可行的SQL写法:

方法1:直接生成波斯历年月字符串分组

SELECT
  format(toDateTime(t.created_date), 'yyyy-MM', 'fa_IR') AS jalali_year_month,
  SUM(t.target_variable) AS total_sum
FROM table t
GROUP BY jalali_year_month
ORDER BY jalali_year_month
  • toDateTime(t.created_date):将Date类型转换为DateTime类型,满足format函数的参数要求
  • format(..., 'yyyy-MM', 'fa_IR'):将日期格式化为波斯历的年月字符串,fa_IR是波斯语(伊朗)的locale标识,确保日期转换为波斯历
  • 按生成的波斯历年月分组,对目标变量求和

方法2:拆分波斯历年份和月份分组

如果需要单独获取波斯历的年和月字段,可以用以下写法:

SELECT
  toYear(toLocaleDate(t.created_date, 'fa_IR')) AS jalali_year,
  toMonth(toLocaleDate(t.created_date, 'fa_IR')) AS jalali_month,
  SUM(t.target_variable) AS total_sum
FROM table t
GROUP BY jalali_year, jalali_month
ORDER BY jalali_year, jalali_month
  • toLocaleDate(t.created_date, 'fa_IR'):直接将Date类型转换为波斯历的Date对象
  • toYear()和toMonth():分别提取波斯历的年份和月份
  • 按年、月分组求和,结果更便于后续按时间顺序排序或处理

注意事项

  • 部分ClickHouse版本中,locale标识使用fa也可生效,但fa_IR是更标准的区域标识,兼容性更好
  • 确保你的ClickHouse实例已包含波斯历的locale数据(官方编译版本默认支持常用locale)

内容的提问来源于stack exchange,提问作者peiman razavi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:30:18