sql - 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,很抱歉。
解决方案
尚未开始实习的实习生可能会被过滤掉,"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 |
让我知道这是否适合您。
推荐阅读
- matlab - Matlab 3D矩阵乘法
- android - 通知 .setContentText 未在 Android 10 上显示
- scala - ZIO:如何动态注入依赖项
- git - 如何从 vscode 中删除同步的远程存储库
- slick-3.0 - 我如何根据条件执行或不执行一行 for-comprehension,使用 scala slickdb
- javascript - 在循环中更改 Rect html Canvas 的颜色
- javascript - 如何将 Google Drive API 的 data-src 分配给 HTML 中的 Canvas
- bash - 使用 bash 脚本插入带有 $s 的 SQL 表
- python - Vscode,python 分段错误(核心转储)
- javascript - 如何在 Observable 订阅者角度 8 中返回承诺