我开发使用Oracle10g数据库的特定软件。
该软件在DB中有自己的DATE,TIME格式: CurrentDate =自01.01.0001以来经过的天数。 此数字作为整数值存储在DB中,例如:当前日期等于735192。
我需要将SYSDATE转换为此格式。如何通过Oracle做到这一点?
我尝试编写一些函数和SQL请求:
CREATE OR REPLACE
FUNCTION MyDaysBetween(aNow IN NUMBER,aThen IN NUMBER) RETURN NUMBER;
IS BEGIN
IF(aNow > aThen) THEN
RETURN (aNow - aThen);
ELSE
RETURN (aThen - aNow);
END IF;
END MyDaysBetween;
FUNCTION QAZ_SYSDATENOW() RETURN NUMBER; /*Converting SYSDATE(20.11.2013) to number of days since 01.01.0001*/
IS
BEGIN
RETURN SELECT SYSDATE - TO_DATE('01.01.0001','DD.MM.YYYY') FROM DUAL;
END MyDaysBetween;
SELECT * FROM TESTS T WHERE (MyDaysBetween(QAZ_SYSDATENOW(),T.D2) = 5); /*T.D2 contains 15.11.2013 asinteger number of days */
但有些东西不起作用,我找不到有什么问题。
答案 0 :(得分:0)
嗯,我不是一个先见,我甚至没有玻璃球或茶渣,所以我不知道你的意思'但是有些东西不起作用',但是,你的主要问题是使用QAZ_SYSDATENOW
函数 - 您不能在PL / SQL中使用SELECT
,您必须SELECT ... INTO
,或者在这种情况下只需RETURN
结果减法。看看这个:
CREATE OR REPLACE
FUNCTION MyDaysBetween(aNow IN NUMBER,aThen IN NUMBER) RETURN NUMBER
IS BEGIN
IF(aNow > aThen) THEN
RETURN (aNow - aThen);
ELSE
RETURN (aThen - aNow);
END IF;
END MyDaysBetween;
/
CREATE OR REPLACE
FUNCTION QAZ_SYSDATENOW RETURN NUMBER
IS
BEGIN
RETURN SYSDATE - TO_DATE('01.01.0001','DD.MM.YYYY');
END QAZ_SYSDATENOW;
/
我摆脱了SELECT
中的RETURN
,只返回表达式的值。
测试:
SELECT MyDaysBetween(TRUNC(QAZ_SYSDATENOW), T.D2) AS val
FROM (SELECT TRUNC(SYSDATE) - 5 - TO_DATE('01.01.0001','DD.MM.YYYY') d2
FROM dual
) t
;
如您所见,我使用您的函数来计算今天(QAZ_SYSDATENOW
)和5天前的天数。我使用TRUNC
两次来摆脱小数部分。如果您需要,请删除TRUNC
。
输出:
VAL ---------- 5