postgresql - Postgres : Calculating the number of working months in the last X years

标签 postgresql

我是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

Range type - Range functions

关于postgresql - Postgres : Calculating the number of working months in the last X years,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28869792/

相关文章:

json - 如何在 postgres 中使用 json_populate_recordset 解析 json

sql - 在 PostgreSQL 选择查询中将时间戳列值转换为纪元

mongodb - 用 MongoDB 替换 PostgreSQL?

postgresql - 使用 psycopg2 在不执行查询的情况下获取 PostgreSQL 结果集列类型

ruby-on-rails - pg_dump : "could not connect to server" in Rails "schema_format = :sql" migration

database - postgresql 给出权限问题

sql - Postgresql 用户未连接到数据库(Nginx Django Gunicorn)

postgresql - 南方数据库错误: relation already exists

java - 在PostgreSql数据库中插入和检查数据

arrays - Postgres : array of NULL values