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

时间:2018-07-25 13:41:19

标签: oracle sql-function

我正在尝试创建一个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;

任何帮助,我们将不胜感激。谢谢!

2 个答案:

答案 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;