0

我在 Posgres 中有一个表,其中包含任务开始日期和任务结束日期。可以在此故事中生成一列,作为(当前日期 - 开始日期)/(开始日期 - 结束日期)之间的比率,该列是经过的时间百分比。我尝试以这种方式但不起作用。

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 
4

2 回答 2

0

手册说 postgres 只支持物化(即存储)生成的列,这意味着该值是在插入或更新行时生成的,这意味着它将使用插入/更新日期,而不是您想要的 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 )
于 2021-01-17T21:56:55.097 回答
-1

我不会编写正确的 SQL 代码。但是您可能/应该将其拆分为两个或三个任务:

  1. 添加允许 null 的新列(应该是默认值)
  2. 更新表
  3. 添加约束(如果需要)
于 2021-01-17T21:07:44.163 回答