最开始每人默认是0天,然后可以请假减天数,增假增加天数,之后每条记录后面显示当前剩余天数按照创建时间排序从上往下倒序排序,使用pgsql
时间: 2024-01-02 13:02:54 浏览: 26
好的,你的问题大致是如何实现一个请假系统,其中包括请假减天数、增加请假天数,以及显示当前剩余天数并按照创建时间排序的功能。同时,你希望使用 Postgres SQL (pgsql) 数据库来存储数据。
首先,你需要设计一个数据库表来存储请假记录。可以考虑以下表结构:
```sql
CREATE TABLE leave_records (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
leave_type VARCHAR(20) NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT NOW() NOT NULL,
days INTEGER NOT NULL
);
```
这个表包含了以下字段:
- `id`:请假记录的唯一标识,使用 `SERIAL` 类型自增长;
- `user_id`:请假人的用户 ID,使用 `INTEGER` 类型;
- `leave_type`:请假类型,使用 `VARCHAR(20)` 类型;
- `start_time`:请假开始时间,使用 `TIMESTAMP` 类型;
- `end_time`:请假结束时间,使用 `TIMESTAMP` 类型;
- `created_at`:请假记录创建时间,使用 `TIMESTAMP` 类型,默认为当前时间;
- `days`:请假天数,使用 `INTEGER` 类型。
接下来,你可以编写一些 SQL 语句来实现请假减天数和增加请假天数的功能。例如:
```sql
-- 请假减天数
UPDATE leave_records
SET days = days - :leave_days
WHERE id = :record_id
AND user_id = :user_id;
-- 增加请假天数
UPDATE leave_records
SET days = days + :leave_days
WHERE id = :record_id
AND user_id = :user_id;
```
其中,`:record_id` 是请假记录的 ID,`:user_id` 是请假人的 ID,`:leave_days` 是要减少或增加的请假天数。
最后,你可以使用以下 SQL 语句来查询并显示当前剩余天数,并按照创建时间倒序排序:
```sql
SELECT id, user_id, leave_type, start_time, end_time, created_at, days,
days - SUM(days) OVER (PARTITION BY user_id ORDER BY created_at DESC, id DESC) AS remaining_days
FROM leave_records
ORDER BY created_at DESC, id DESC;
```
这个查询语句使用了窗口函数 `SUM`,计算每个用户的所有请假记录的总天数,并在每条记录的后面添加了一个 `remaining_days` 字段来显示当前剩余天数。注意,这里使用了 `PARTITION BY user_id` 子句来将每个用户的请假记录分组,并按照创建时间倒序排序。