面对以下两个代码的不同输出

问题描述 投票:0回答:1

必须获得在成立后3年内被收购的公司数量

欢迎任何关于更好代码的建议!

我的代码

COUNT( CASE WHEN  (acquisitions.acquired_at_cleaned - companies.founded_at_clean::timestamptz) <= (INTERVAL '3 Year') THEN 1
ELSE NULL END )as acquired_3_yrs

网站回答

COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + INTERVAL '3 years'THEN 
1 ELSE NULL END) AS acquired_3_yrs

这两个都给出不同的输出,变化非常小。 请解释我哪里出错了。

sql case intervals
1个回答
0
投票

你的问题是你在不同的时间单位之间进行比较。如果您简单地选择

acquisitions.acquired_at_cleaned - companies.founded_at_clean
,您将得到一个以多少天和多少小时表示的答案。这不能准确地与以年表示的间隔进行比较。

作为测试简单地尝试

SELECT (INTERVAL '1080 DAY') <= (INTERVAL '3 YEAR');

SELECT (INTERVAL '1081 DAY') <= (INTERVAL '3 YEAR');

第一个是真的,第二个是假的。为什么?因为一年有12个月。一个月有多少天?有效地 Postgres 使用一年 12 个月 30 天。这不是错误。否则没有真正正确的方法(想想闰年!)。

网站的答案是正确的,因为 3 年被添加到一个特定的日期,这将给出预期的答案,

© www.soinside.com 2019 - 2024. All rights reserved.