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 将它分成两个或三个任务:

  1. 添加允许空值的新列(这应该是默认值)
  2. 更新table
  3. 添加约束(如果需要)

手册说 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 )