Oracle 将日期转换为密钥失败

Oracle 将日期转换为密钥失败,oracle,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

我已经搜遍了资料来源,我尝试过的每一个版本都失败了。 基本上,此函数接受日期并返回数字

例如: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;   

您应该在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; 

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

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
它将返回不同的结果,但我认为这与您的情况无关,否则返回-1*TO_CHAR(DT,'yyyyymmdd')


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

您已标记为oracle,但代码不是oracle。请设置正确的标签。这是我尝试的第一件事,但它不起作用。谢谢