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
相关产品推荐
相关产品推荐

