首页 > 解决方案 > PostgreSQL:显示剩余天数

问题描述

我有一张包含学员名单的表格,我必须找出距离他们的练习结束还有多少天。该字段包含练习开始日期,输出应包含“Days(x)”之类的字段。诀窍是只显示那些从事培训(8 个月)的学员。表的测试值:

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 scheme.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');

我不知道如何将负值AGE(CURRENT_DATE, "pr_st_date")与正值分开,我尝试使用此功能过滤那些尚未开始练习的实习生。谷歌搜索了几乎所有内容,然后卡住了。PS:我刚开始学习SQL,很抱歉。

标签: sqlpostgresql

解决方案


尚未开始实习的实习生可能会被过滤掉,"pr_st_date" < CURRENT_DATE因为他们的开始日期将大于当前日期。

您可以尝试以下方法:

第一个查询显示计算的逻辑/结果,而最终查询可能是您正在寻找的。这里date_part使用了函数

查询 #1

SELECT
    *,  
    AGE("pr_st_date") as age,
    DATE_PART('year',  AGE("pr_st_date")) as years,
    DATE_PART('month',AGE("pr_st_date")) as months,
    CURRENT_DATE,
    CASE
        WHEN "pr_st_date" < CURRENT_DATE AND 
              DATE_PART('year',  AGE("pr_st_date")) < 1 AND
              DATE_PART('month',AGE("pr_st_date")) <8 THEN 1
        ELSE 0
    END as in_training,
    (CURRENT_DATE - "pr_st_date") as days_remaining
FROM
    interns;
实习生ID f_name l_name 性别 pr_st_date 年龄 当前的日期 在培训中 剩余天数
1 伊万 伊万诺夫 2020-09-22T00:00:00.000Z {“年”:1,“天”:22} 1 0 2021-10-14T00:00:00.000Z 0 387
2 娜塔莉亚 库尔茨 F 2021-01-12T00:00:00.000Z {“月”:9,“天”:2} 0 9 2021-10-14T00:00:00.000Z 0 275
3 克里斯蒂安 汤普森 2021-10-20T00:00:00.000Z {“天”:-6} 0 0 2021-10-14T00:00:00.000Z 0 -6
4 力比 乌尔什 F 2021-12-30T00:00:00.000Z {"月":-2,"天":-16} 0 -2 2021-10-14T00:00:00.000Z 0 -77
5 加里 切刀 2021-01-30T00:00:00.000Z {"月":8,"天":15} 0 8 2021-10-14T00:00:00.000Z 0 257
6 史蒂文 拉尔森 2021-02-25T00:00:00.000Z {“月”:7,“天”:17} 0 7 2021-10-14T00:00:00.000Z 1 231
7 劳里 2021-03-16T00:00:00.000Z {“月”:6,“天”:29} 0 6 2021-10-14T00:00:00.000Z 1 212
8 强尼 沃克 2021-01-31T00:00:00.000Z {“月”:8,“天”:14} 0 8 2021-10-14T00:00:00.000Z 0 256
9 凯蒂 佩里 F 2021-05-11T00:00:00.000Z {“月”:5,“天”:3} 0 5 2021-10-14T00:00:00.000Z 1 156
10 丽莎 撕裂 F 2020-11-28T00:00:00.000Z {"月":10,"天":16} 1 10 2021-10-14T00:00:00.000Z 0 320
11 伊利 号角 F 2021-01-16T00:00:00.000Z {“月”:8,“天”:29} 0 8 2021-10-14T00:00:00.000Z 0 271
12 鲍勃 建造者 2021-10-01T00:00:00.000Z {“天”:13} 0 0 2021-10-14T00:00:00.000Z 1 13

查询 #2

SELECT
    *,
    (CURRENT_DATE - "pr_st_date") as days_remaining
FROM
    interns
WHERE
    "pr_st_date" < CURRENT_DATE AND 
     DATE_PART('year',  AGE("pr_st_date"))< 1 AND 
     DATE_PART('month',AGE("pr_st_date")) <8;
实习生ID f_name l_name 性别 pr_st_date 剩余天数
6 史蒂文 拉尔森 2021-02-25T00:00:00.000Z 231
7 劳里 2021-03-16T00:00:00.000Z 212
9 凯蒂 佩里 F 2021-05-11T00:00:00.000Z 156
12 鲍勃 建造者 2021-10-01T00:00:00.000Z 13

在 DB Fiddle 上查看工作演示

让我知道这是否适合您。


推荐阅读