Sql 如何创建函数减去两个日期?

Sql 如何创建函数减去两个日期?,sql,plsql,Sql,Plsql,如何返回expirydate sysdate的值?这给了我错误。有人能帮我吗 CREATE OR REPLACE FUNCTION calc_remain_data(accountNumber account.account_number%TYPE) RETURN date IS CridetCardNo number(8); expirydate date; res date; BEGIN SELECT cred

如何返回
expirydate sysdate
的值?这给了我错误。有人能帮我吗

   CREATE OR REPLACE FUNCTION calc_remain_data(accountNumber account.account_number%TYPE)
    RETURN date IS
       CridetCardNo number(8); 
       expirydate date;
       res date;
    BEGIN

       SELECT credit_card_number into CridetCardNo 
       FROM c_relation 
       WHERE account_number = accountNumber ; 

       SELECT expiry_date into expirydate 
       FROM credit_card 
       WHERE credit_card_number = CridetCardNo;

       SELECT expirydate-SYSdate as result 
       from dual ; 

       return result  ;
    END;
你可以用这个

CREATE OR REPLACE FUNCTION calc_remain_data(accountNumber account.account_number%TYPE)
RETURN number IS
   l_CreditCardNo number(8); 
   l_expirydate date;
   l_result number;
BEGIN

   SELECT credit_card_number INTO l_CreditCardNo 
   FROM c_relation 
   WHERE account_number = accountNumber ; 

   SELECT expiry_date INTO l_expirydate 
   FROM credit_card 
   WHERE credit_card_number = l_CreditCardNo;

   l_result := l_expirydate - sysdate;

   return l_result  ;
END;

Editted:更改已注释的返回类型

您不需要两个不同的SELECT语句,只需一个JOIN就可以更有效地执行此操作


从一个日期减去另一个日期的结果不是一个日期,而是一个表示这两个日期之间天数的数字。因此,您不能将
l_expirydate-sysdate
的结果分配给定义为
DATE
的变量

你没有告诉我们函数应该返回什么。如果“剩余数据”是指天数,则将l_结果定义为
number
,并更改函数以返回数字:

CREATE OR REPLACE FUNCTION calc_remain_data(accountNumber account.account_number%TYPE)
  RETURN number --<< HERE
IS
  l_remaining_days number; --<< NOT a date!
BEGIN

   -- you can store the result of the calculation directly in the variable
   SELECT cc.expiry_date - sysdate
      INTO l_remaining_days
   FROM c_relation cr
     JOIN credit_card cc ON cc.credit_card_number = cr.credit_card_number
   WHERE account_number = accountNumber; 

   return l_remaining_days;
END;
/
创建或替换函数计算保留数据(accountNumber account.account\u number%类型)

返回编号--您可以使用间隔数据类型:

CREATE OR REPLACE FUNCTION CALC_REMAIN_DATA (
   ACCOUNTNUMBER    ACCOUNT.ACCOUNT_NUMBER%TYPE)
   RETURN INTERVAL DAY TO SECOND--You can specify desired type here
IS
   CRIDETCARDNO   NUMBER (8);
   EXPIRYDATE     DATE;
   RES            DATE;
BEGIN
   SELECT CREDIT_CARD_NUMBER
     INTO CRIDETCARDNO
     FROM C_RELATION
    WHERE ACCOUNT_NUMBER = ACCOUNTNUMBER;

   SELECT EXPIRY_DATE
     INTO EXPIRYDATE
     FROM CREDIT_CARD
    WHERE CREDIT_CARD_NUMBER = CRIDETCARDNO;

   RETURN NUMTODSINTERVAL (EXPIRYDATE - SYSDATE, 'Day');--this function convert float number to interval type and has another version numtoyminterval
                                                 --^this specify the unit to calculate the interval
END;

实际上,date类型在这里对您帮助不大,相反interval类型帮助您获得两个日期在{Day Hour Minutes Seconds Timestamp}中的差值,或者您可以使用另一个interval类型Year to Month来计算{Year Month}中的值

你忘了问一个问题。为什么这么多select语句
l_expirydate-sysdate
返回一个数字,而不是
DATE
,所以不能将其分配给定义为
DATE
的变量?我知道有什么东西关闭了:D