如何形成 oracle 函数 - 如果 /else return 不同的 TIMESTAMP 值

How to form oracle function - if /else return different TIMESTAMP values

我正在尝试创建一个 sql 函数,如果满足特定条件,该函数 return 一个 TIMESTAMP 值,否则 return 一个 TIMESTAMP 值加上额外的 30 天。这是我创建的函数(但未编译):

CREATE OR REPLACE FUNCTION "DUEDATE" (DATE_A IN TIMESTAMP, NUM_DAYS IN NUMBER, DATE_B IN TIMESTAMP) 
RETURN TIMESTAMP AS 
BEGIN
  IF SYSDATE - CAST(DATE_B) < 30
    RETURN CAST(DATE_A AS DATE) + (((NUM_DAYS/30) + 1)) * 30
  ELSE
    RETURN CAST(DATE_A AS DATE) + ((((NUM_DAYS/30) + 1)) * 30) + 30
END;

非常感谢任何帮助。谢谢!

我建议您买一本好的 pl/sql 书,或者阅读 oracle 文档。你有一堆语法错误。

CREATE OR REPLACE FUNCTION "DUEDATE" (DATE_A IN TIMESTAMP, NUM_DAYS IN NUMBER, DATE_B IN TIMESTAMP) 
RETURN TIMESTAMP AS 
BEGIN
  IF SYSDATE - DATE_B < 30 THEN
    RETURN CAST(DATE_A AS DATE) + (((NUM_DAYS/30) + 1)) * 30;
  ELSE 
    RETURN CAST(DATE_A AS DATE) + ((((NUM_DAYS/30) + 1)) * 30) + 30;
  END IF;    
END;

您的计算似乎等于在 DATE_A 上加上 30 天或 60 天,所以我不确定您为什么要除法和乘法。我也不确定为什么当参数和 return 值是时间戳时你要使用日期;您可以改用时间戳和间隔:

CREATE OR REPLACE FUNCTION "DUEDATE" (DATE_A IN TIMESTAMP, NUM_DAYS IN NUMBER, DATE_B IN TIMESTAMP) 
RETURN TIMESTAMP AS 
BEGIN
  IF DATE_B > SYSTIMESTAMP - INTERVAL '30' DAY THEN
    RETURN DATE_A + (NUM_DAYS + 30) * INTERVAL '1' DAY;
  ELSE
    RETURN DATE_A + (NUM_DAYS + 60) * INTERVAL '1' DAY;
  END IF;
END;
/

CREATE OR REPLACE FUNCTION "DUEDATE" (DATE_A IN TIMESTAMP, NUM_DAYS IN NUMBER, DATE_B IN TIMESTAMP) 
RETURN TIMESTAMP AS 
BEGIN
  RETURN DATE_A + (NUM_DAYS + CASE WHEN DATE_B > SYSTIMESTAMP - INTERVAL '30' DAY
                                   THEN 30 ELSE 60 END) * INTERVAL '1' DAY;
END;
/

据我所知,这会得到相同的结果 - 除了它会保留小数秒,当你投射到日期时,这些秒会丢失。


db<>fiddle demo 运行 这两个函数适用于今年的每一天,并且还显示带有和不带有 CAST(DATE_B AS DATE) 的@OldProgrammer 版本的结果 - 注意 (a) 前两个函数保留小数秒,并且 (b) 第三个得到不同的结果,直到你到达 30 天前(运行 今天,结果第 18 页的 2018-06-26 发生变化)。