如果DATE具有特定格式(NOT DATE),则返回两个日期之间的天数

时间:2013-11-20 13:15:19

标签: sql oracle plsql oracle10g syntax-error

我开发使用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 */

但有些东西不起作用,我找不到有什么问题。

1 个答案:

答案 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