如何形成oracle函数-if/else返回不同的TIMESTAMP值



我正在尝试创建一个sql函数,如果满足某个条件,该函数将返回一个TIMESTAMP值,或者返回一个IMESTAMP值加上额外的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;

非常感谢您的帮助。谢谢

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

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演示了今年每天运行这两个函数,还显示了@OldProgrammer版本的结果,无论有没有CAST(DATE_B AS DATE),请注意(a(前两个函数保留小数秒,(b(第三个函数在30天前之前都会得到不同的结果(今天运行,结果第18页的2018-06-26更改(。

我建议买一本好的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;

最新更新