前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >clickhouse中toDate和toDateTime不能处理1970年之前时间问题

clickhouse中toDate和toDateTime不能处理1970年之前时间问题

作者头像
公众号-利志分享
发布2022-04-25 09:24:52
1.4K0
发布2022-04-25 09:24:52
举报
文章被收录于专栏:利志分享利志分享

最近我们有个按照年龄分布的统计分析需求,数据分析师要分析大于50岁的人群有多少,他用了toDate处理字段birthday转换时间格式,通过dateDiff来对比生日时间和当前时间,从而计算年龄。然后这样的计算,我们计算出来的超过50的岁的数据占比很大,我们怎么想也觉得不太可能有这么多老年人玩我们的产品,如果是微信那样的产品,那还有可能。出于这样的怀疑,我们去细查我们当时写的sql:

代码语言:javascript
复制
datediff('year',toDate(birthday),toDate(now()))

我们查了一些明细,发现明明有60岁的,也有为空的数据,都变成了51岁。发现了这个规则之后我们把sql拆出来看看计算结果。比如:

代码语言:javascript
复制
datediff('year', toDate('1952-02-01'), toDate(now()))

这个返回是51,接下来拆分toDate('1952-02-01')的值,发现结果变成了1970-01-01,试了好几个值都变成1970-01-01。

经过验证,在官网的issue里面找到相关回答:We don't support dates before unix epoch.意思就是说unix时间戳之前的时间不支持。链接如下:https://github.com/ClickHouse/ClickHouse/issues/18511,所以针对于1970年之前的时间计算都会变成51岁,这样会造成统计的数据不准确。

发现这个问题之后,我们调整了实现方案,通过截取birthday字段的前四位转成int32,然后取当前的年去做相减,得到年龄,通过这样的方法之后才获取到正确的值。sql如下:

代码语言:javascript
复制
select minus(cast(toYear(now()),'Int32'),cast(substring('1952-02-01',1,4),'Int32'))

这样就正确解决了unix时间戳之前的时间不支持问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档