两段统计成立3年内被收购公司数的SQL代码输出不同,求差异原因
两段SQL代码的差异及问题分析
核心差异点
时区处理不一致
- 你的代码把
companies.founded_at_clean转成了带时区的timestamptz,如果acquisitions.acquired_at_cleaned是不带时区的timestamp,计算差值时会被自动转成当前会话时区的timestamptz,结果会跟着会话时区变化,比如换个时区统计,可能得到不同的数值。 - 参考代码统一转成不带时区的
timestamp,所有计算基于纯时间字符串,不受时区影响,结果更稳定。
- 你的代码把
时间比较逻辑本质不同
- 你的代码是计算两个时间的精确间隔,再和3年区间对比:只有当收购时间和成立时间的精确差(含时分秒)严格≤3年的总时长,才会被统计。比如公司2020-01-01 23:00成立,2023-01-01 00:00被收购,精确差是3年1小时,超过了3年区间,你的代码不会统计它。
- 参考代码是把成立时间往后推3年得到一个具体时间点,再判断收购时间是否在这个点之前/等于:只要收购时间的日历时间不晚于成立时间加3年的那个点,就会被统计。上面的例子里,成立时间加3年是2023-01-01 23:00,收购时间2023-01-01 00:00在这个点之前,会被统计,这更符合“成立后3年内”的业务直觉。
你的代码存在的问题
- 时区转换引入了结果的不确定性,不同环境下统计结果可能不一致;
- 精确时间差的逻辑不符合业务上对“3年内”的常规理解——业务一般按日历周期判断,而不是卡精确的秒数。
内容的提问来源于stack exchange,提问作者Sanchit Goyal
相关产品推荐
相关产品推荐

