我有一个账户的平均年龄。为此,我使用了以下代码。
select
m."storeId", s."locationName",
COUNT(m."membershipEnded" is not null) as "Cancelations",
AVG(AGE(m."membershipEnded"::date, m."memberSince"::date)) as "Membership Duration in days"
FROM "members" m
INNER JOIN "stores" s on s."storeId" = m."storeId"
where (m."membershipEnded" is not null
and m."membershipEnded"::date > m."memberSince"::date)
and "memberSince" is not null
and f."countryCode" in ('US','CA')
and s."storeStatus" ='Active'
group by 1,2
order by "storeId";我得到的结果包括无效天数,因此其中一个例子是:“1年35天22:17:08.546743”或另一个例子是“2年9MON 41天13:42:51.453257”。
我到处找遍了,但找到了误判的原因。
任何和所有的帮助都将不胜感激。
我还会注意到,我只是减去这两种方法来得到天数的差异,但我更喜欢那些年、月、日的结果,就像随着年龄的变化一样。
Postgresql版本为10.9
*编辑-用下面的答案回答更新的代码:
justify_interval()很有魅力
select
m."storeId", s."locationName",
COUNT(m."membershipEnded" is not null) as "Cancelations",
justify_interval(AVG(AGE(m."membershipEnded"::date, m."memberSince"::date))) as "Membership Duration in days"
FROM "members" m
INNER JOIN "stores" s on s."storeId" = m."storeId"
where (m."membershipEnded" is not null
and m."membershipEnded"::date > m."memberSince"::date)
and "memberSince" is not null
and s."countryCode" in ('US','CA')
and s."storeStatus" ='Active'
group by 1,2
order by "storeId";发布于 2022-02-02 19:10:05
间隔期的操作可以导致这样的结果,因为操作是在年月、月、日等时间内完成的。
要克服这一问题,请使用justify_interval调整超过数月/日/小时等。
select justify_interval('1 year 35 days 22:17:08.546743'),
justify_interval('2 years 9 mons 41 days 13:42:51.453257');
justify_interval | justify_interval
-------------------------------------+-----------------------------------------
1 year 1 mon 5 days 22:17:08.546743 | 2 years 10 mons 11 days 13:42:51.453257https://stackoverflow.com/questions/70960037
复制相似问题