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