2013-11-20 33 views
-1

我开发使用Oracle10g数据库的特定软件。如果DATE具有特定格式(不是日期),则返回两个日期之间的天数

此软件在DB中有它自己的日期,时间格式: CurrentDate =从01.01.0001开始经过的天数。 这个数字以整数值存储在DB中,例如:当前日期等于735192.

我需要将SYSDATE转换为此格式。如何通过Oracle执行此操作?

我试着写一些功能和SQL requst:

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 */ 

可是,我不工作,我找不到什么是错的。

+2

我建议SYSDATE后以删除括号。 – tvm

+0

我删除它,没有任何改变。如何调试脚本?我如何在运行时查看返回函数? – Alexandr

+1

调试器(Oracle的SQLDeveloper IDE有一个)或dbms_output软件包可以帮助您了解正在发生的事情。 – tvm

回答

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; 
/

我得到了在RETURN摆脱SELECT的,只是返回表达式的值。

测试:

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
+0

是的,它可以工作,但是:1.为什么选择?我只需要在其他测试表格字段的请求中使用下一个IF操作的结果编号。 2.在你的例子中什么是“ - 5 - ”? – Alexandr

+1

@Alexandr我提供的'SELECT'语句仅仅是测试你的函数。你可以使用你想要的功能。我的意图是向你展示它的工作原理。 '-5'只是为了在5天前得到一个日期,只是为了一个测试,以后从'SYSDATE'中减去它来表明该函数有效。 –

相关问题