2013-11-20 65 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'中減去它來表明該函數有效。 –

相關問題