Postgres - 创建一列(alter table)作为其他两列的计算
Postgres - create a column (alter table) as a calculation of other two columns
我在 Posgres 中有一个 table,其中包含任务开始日期和任务结束日期。可以在这个故事中生成一个列作为(当前日期 - 开始日期)/(开始日期 - 结束日期)之间的比率,该列是时间流逝的百分比。我用这种方法试过,但不起作用。
ALTER TABLE public.gantt_task
ADD COLUMN
percentage_progress
GENERATED ALWAYS AS (
(DATEDIFF("day",
CURRENT_DATE,public.gantt_Tasks.start_date)) / DATEDIFF("day", public.gantt_Tasks.end_date ,public.gantt_Tasks.start_date))
STORED
我不会编写正确的 SQL 代码。但是你 might/should 将它分成两个或三个任务:
- 添加允许空值的新列(这应该是默认值)
- 更新table
- 添加约束(如果需要)
手册说 postgres 只支持物化(即存储)生成的列,这意味着该值是在插入或更新行时生成的,这意味着它将使用 insert/update 日期,而不是 CURRENT_DATE你想要的
因此,您需要创建一个视图。这允许在 SELECT 而非 INSERT/UPDATE 的日期计算 CURRENT_DATE 以生成列。
CREATE VIEW foo AS SELECT *,
(CURRENT_DATE - public.gantt_Tasks.start_date)
/ (public.gantt_Tasks.end_date-public.gantt_Tasks.start_date)
AS percentage_progress
FROM public.gantt_task
注意 DATEDIFF 是 mysql 语法而不是 postgres,并且不允许被零除,所以如果 start_date 和 end_date 可以相同那么你必须修改表达式条件取决于你想要什么。当 CURRENT_DATE 晚于 end_date 时,你的表情也会超过 100%。也许是这样的:
least( 1.0, (CURRENT_DATE-start_date)/greatest( 1, end_date-start_date)::FLOAT )
我在 Posgres 中有一个 table,其中包含任务开始日期和任务结束日期。可以在这个故事中生成一个列作为(当前日期 - 开始日期)/(开始日期 - 结束日期)之间的比率,该列是时间流逝的百分比。我用这种方法试过,但不起作用。
ALTER TABLE public.gantt_task
ADD COLUMN
percentage_progress
GENERATED ALWAYS AS (
(DATEDIFF("day",
CURRENT_DATE,public.gantt_Tasks.start_date)) / DATEDIFF("day", public.gantt_Tasks.end_date ,public.gantt_Tasks.start_date))
STORED
我不会编写正确的 SQL 代码。但是你 might/should 将它分成两个或三个任务:
- 添加允许空值的新列(这应该是默认值)
- 更新table
- 添加约束(如果需要)
手册说 postgres 只支持物化(即存储)生成的列,这意味着该值是在插入或更新行时生成的,这意味着它将使用 insert/update 日期,而不是 CURRENT_DATE你想要的
因此,您需要创建一个视图。这允许在 SELECT 而非 INSERT/UPDATE 的日期计算 CURRENT_DATE 以生成列。
CREATE VIEW foo AS SELECT *,
(CURRENT_DATE - public.gantt_Tasks.start_date)
/ (public.gantt_Tasks.end_date-public.gantt_Tasks.start_date)
AS percentage_progress
FROM public.gantt_task
注意 DATEDIFF 是 mysql 语法而不是 postgres,并且不允许被零除,所以如果 start_date 和 end_date 可以相同那么你必须修改表达式条件取决于你想要什么。当 CURRENT_DATE 晚于 end_date 时,你的表情也会超过 100%。也许是这样的:
least( 1.0, (CURRENT_DATE-start_date)/greatest( 1, end_date-start_date)::FLOAT )