我是users表和jobs。用户有很多工作,工作有开始日期和结束日期:
Column | Type | Modifiers
----------------+-----------------------------+---------------------------------------------------
id | integer | not null default nextval('jobs_id_seq'::regclass)
title | character varying |
employer | character varying |
start_date | date |
end_date | date |
user_id | integer |
我需要计算一个人在过去 X 年内工作的总月数。
我查看了 OVERLAPS
并尝试了一些间隔,但我不太清楚我需要什么。我想确保即使 start_date 超出 X 年范围,我仍然计算在该范围内的月份。
这是我目前所拥有的:
select sum(EXTRACT(YEAR FROM months) * 12 + EXTRACT(MONTH FROM months))
as working_months
from (
select CASE current
WHEN true THEN
age(current_date, start_date)
ELSE age(end_date, start_date)
END as months
from jobs inner join users on jobs.user_id = users.id
where users.id = 4
) as employment_time;
最佳答案
with jobs (start_date, end_date, user_id) as ( values
('2000-01-01'::date, '2005-12-31'::date, 1),
('2007-10-01', '2008-09-30', 1),
('2010-09-01', '2014-10-20', 1)
)
select
user_id,
extract(year from work_time) * 12 + extract(month from work_time) as months
from (
select
user_id,
sum(age(upper(period), lower(period))) as work_time
from (
select
user_id,
daterange(start_date, end_date, '[]') *
daterange((current_date - interval '10 years')::date, current_date)
as period
from jobs
) s
group by user_id
) s
;
user_id | months
---------+--------
1 | 70
关于postgresql - Postgres : Calculating the number of working months in the last X years,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28869792/