将日期转换为密钥失败

时间:2016-10-28 06:38:25

标签: oracle

我已经搜索了这些来源,我试过的每一个版本都失败了。 基本上,这个函数需要一个日期,并且应该返回数字。

例如:2010年4月1日,将返回-20160401 这看起来很简单,但这花费了我几个小时的时间。

CREATE OR REPLACE FUNCTION MAKE_KEY( DT DATE ) RETURN NUMBER IS

DATE_KEY NUMBER := 0;
yyyy SMALLINT := 2000;
mm SMALLINT := 1;
dd SMALLINT := 1;

BEGIN
        IF DT IS NOT NULL THEN
            yyyy := YEAR(DT);
            mm := MONTH(DT);
            dd := DAY(DT);
        END IF; 
        DATE_KEY := (-1 * (yyyy * 10000 + mm * 100 + dd));

        RETURN  DATE_KEY;

END MAKE_KEY;   

2 个答案:

答案 0 :(得分:1)

你应该在plsql中写这个:

CREATE OR REPLACE FUNCTION MAKE_KEY( DT DATE ) RETURN NUMBER IS

DATE_KEY NUMBER := 0;
yyyy SMALLINT := 2000;
mm SMALLINT := 1;
dd SMALLINT := 1;

BEGIN
        IF DT IS NOT NULL THEN
            yyyy := extract(year from DT);
            mm := extract(month from DT);
            dd := extract(day from DT);
        END IF; 
        DATE_KEY := (-1 * (yyyy * 10000 + mm * 100 + dd));

        RETURN  DATE_KEY;

END MAKE_KEY; 

答案 1 :(得分:1)

最简单,最简短的解决方案是:

CREATE OR REPLACE FUNCTION MAKE_KEY( DT DATE ) RETURN NUMBER IS
BEGIN
   RETURN TO_CHAR(DT, '-YYYYMMDD');
END;

你甚至不需要一个函数,你可以直接在SQL或PL / SQL中使用TO_CHAR(DT, '-YYYYMMDD')

对于日期BC,它会返回不同的结果,但我不认为这与您的情况有关,否则请RETURN -1*TO_CHAR(DT, 'YYYYMMDD');

如果0输入需要NULL,您可以执行COALESCE(TO_CHAR(NULL, '-YYYYMMDD'),0)