我正在尝试创建一个sql函数,如果满足某些条件,该函数将返回一个TIMESTAMP值,否则将返回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;
任何帮助,我们将不胜感激。谢谢!
答案 0 :(得分:2)
您的计算似乎等于向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 demo今年每天都运行这两个函数,并且还显示了有和没有CAST(DATE_B AS DATE)
的@OldProgrammer版本的结果-请注意(a)前两个函数保留小数秒,并且(b)在您达到30天之前,第三位得到的结果会有所不同(今天运行,结果的第18页于2018-06-26更改)。
答案 1 :(得分:1)
我建议您阅读一本不错的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;