我已经搜索了这些来源,我试过的每一个版本都失败了。 基本上,这个函数需要一个日期,并且应该返回数字。
例如: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;
答案 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)