PostgreSQL如何查询8个月实习期内实习生的剩余实习天数
实现逻辑说明
- 实习周期筛选逻辑:
- 过滤未开始实习的人员:要求实习开始日期小于等于当前日期
- 过滤已结束实习的人员:要求实习开始日期加8个月大于当前日期
- 剩余天数计算:用实习结束日期(开始日期+8个月)直接减去当前日期,得到的正整数就是剩余天数,不用额外处理正负值
- 格式处理:将计算得到的剩余天数直接拼接为要求的
Days(x)格式即可
完整可执行SQL(PostgreSQL语法,适配你使用的AGE函数的数据库环境)
-- 建表语句(修正了原语句缺少右括号的语法错误) CREATE TABLE IF NOT EXISTS "interns" ( "intern_id" smallint(5) NOT NULL, "f_name" varchar(20) NOT NULL, "l_name" varchar(20) NOT NULL, "gender" varchar(20) NOT NULL, "pr_st_date" date DEFAULT NULL, PRIMARY KEY ("intern_id") ); -- 插入测试数据 INSERT INTO interns VALUES (1,'Ivan','Ivanov','M','2020-09-22'), (2,'Natalia','Kurtz','F','2021-01-12'), (3,'Kristian','Tompson','M','2021-10-20'), (4,'Libi','Uolsh','F','2021-12-30'), (5,'Garry','Cutcher','M','2021-01-30'), (6,'Steven','Larson','M','2021-02-25'), (7,'Hugh','Laurie','M','2021-03-16'), (8,'Jonny','Walker','M','2021-01-31'), (9,'Ketty','Perri','F','2021-05-11'), (10,'Liza','Torn','F','2020-11-28'), (11,'Ely','Buggle','F','2021-01-16'); -- 核心查询语句 SELECT intern_id, f_name, l_name, gender, pr_st_date, CONCAT('Days(', (pr_st_date + INTERVAL '8 months')::date - CURRENT_DATE, ')') AS remaining_days FROM interns WHERE pr_st_date <= CURRENT_DATE AND pr_st_date + INTERVAL '8 months' > CURRENT_DATE;
其他环境适配说明
如果你使用的是MySQL数据库,只需要调整时间计算相关的语法即可:
- 实习结束日期计算改为
DATE_ADD(pr_st_date, INTERVAL 8 MONTH) - 剩余天数计算改为
DATEDIFF(DATE_ADD(pr_st_date, INTERVAL 8 MONTH), CURDATE())
不使用AGE函数的原因是它返回的是年月天组合的间隔类型,直接计算天数差值不如用结束日期减当前日期的逻辑直观,也更方便做过滤判断。
内容的提问来源于stack exchange,提问作者Sad Scientist
相关产品推荐
相关产品推荐

