2014-01-08 40 views
0

我有一個選擇查詢,使用函數。按日期排序不使用小時和分鐘訂購

該函數使一個子串成爲一個字符串,獲取一個日期,然後按日期排序,並以正確的順序返回字符串。

所以,我有我的選擇:

SELECT DISTINCT ec.id_echange_candidat, 
(select f_tridate_concat(f_concat(iw.nom_declencheur ||' ' || iw.prenom_declencheur ||'->'||iw.nom_valideur ||' ' || iw.prenom_valideur || ' demandé le '||to_date(to_char(iw.date_creation), 'DD/MM/YY HH24:MI:SS')|| ' : ' ||iw.avis), '$', 'demandé le ', ' : ', '') 
    from t_instance_workflow iw 
    where ec.id_echange_candidat = iw.id_objet) as resume_workflow 
FROM t_echange_candidat ec 

而且功能:

create or replace 
FUNCTION F_TRIDATE_CONCAT (p_chaine VARCHAR2, p_sepFonction VARCHAR2, p_sepAvChampTri VARCHAR2, p_sepApChampTri VARCHAR2, p_sepFinal VARCHAR2) 
RETURN VARCHAR2 AS 
    v_str VARCHAR2(32767); 

BEGIN 
    SELECT replace(f_concat(ma_chaine), '$',p_sepFinal) INTO v_str FROM 
    (
    SELECT REGEXP_SUBSTR(p_chaine, '[^'||p_sepFonction||']+', 1, LEVEL) ma_chaine 
    FROM dual 
    CONNECT BY INSTR(p_chaine, p_sepFonction, 1, LEVEL - 1) > 0 
    ORDER BY to_date(SUBSTR(ma_chaine,instr(ma_chaine,p_sepAvChampTri,1)+length(p_sepAvChampTri),(instr(ma_chaine,p_sepApChampTri,1))-(instr(ma_chaine,p_sepAvChampTri,1)+length(p_sepAvChampTri))),'DD/MM/YY HH24:MI:SS') 
) 
    ; 
    RETURN v_str; 
END F_TRIDATE_CONCAT; 

的事情是,它似乎它不使用小時和分鐘,由作出命令,所以,如果我有這樣的臺詞:

line 1 text ... 10/12/2013 text ... (with 11 pm in db) 
line 2 text ... 10/12/2013 text ... (with 10 pm in db) 

我會得到這個字符串:

line 1 text ... 10/12/2013 text ... 
line 2 text ... 10/12/2013 text ... 

雖然我應該得到這樣的:

line 2 text ... 10/12/2013 text ... 
line 1 text ... 10/12/2013 text ... 

因爲lines 2 date是在充分10/12/2013 10:00:00lines 1 date是完全10/12/2013 11:00:00

爲什麼不是用小時和分鐘,而在我的功能,我在我的訂單中使用格式日期,如「DD/MM/YY HH24:MI:SS」?

編輯:現在得到了我SELECT查詢使用TO_DATE當一個 「格式代碼出現兩次」 錯誤信息......

這意味着它成爲:

SELECT DISTINCT ec.id_echange_candidat, 
(select f_tridate_concat(f_concat(iw.nom_declencheur ||' ' || iw.prenom_declencheur ||'->'||iw.nom_valideur ||' ' || iw.prenom_valideur || ' demandé le '||iw.date_creation|| ' : ' ||iw.avis), '$', 'demandé le ', ' : ', '') 
    from t_instance_workflow iw 
    where ec.id_echange_candidat = iw.id_objet) as resume_workflow 
FROM t_echange_candidat ec 


create or replace 
FUNCTION f_concat (p_input VARCHAR2) 
RETURN VARCHAR2 
PARALLEL_ENABLE AGGREGATE USING t_f_concat; 

create or replace 
TYPE "T_F_CONCAT"                                                          AS OBJECT ("G_STRING" 
    VARCHAR2(32767), 
    STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_f_concat) 
    RETURN NUMBER , 

    MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_f_concat, 
             value IN  VARCHAR2) 
    RETURN NUMBER, 
    MEMBER FUNCTION ODCIAggregateTerminate(self   IN t_f_concat, 
             returnValue OUT VARCHAR2, 
             flags  IN NUMBER) 
    RETURN NUMBER, 


    MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_f_concat, 
            ctx2 IN  t_f_concat) 
    RETURN NUMBER 
); 

create or replace 
type body t_f_concat is 
    STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_f_concat) 
    RETURN NUMBER IS 
    BEGIN 
    sctx := t_f_concat(NULL); 
    RETURN ODCIConst.Success; 
    END; 

    MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_f_concat, 
             value IN  VARCHAR2) 
    RETURN NUMBER IS 
    BEGIN 
    SELF.g_string := self.g_string || '$' || value; 
    RETURN ODCIConst.Success; 
    END; 

    MEMBER FUNCTION ODCIAggregateTerminate(self   IN t_f_concat, 
             returnValue OUT VARCHAR2, 
             flags  IN NUMBER) 
    RETURN NUMBER IS 
    BEGIN 
    returnValue := RTRIM(LTRIM(SELF.g_string, '$'), '$'); 
    RETURN ODCIConst.Success; 
    END; 

    MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_f_concat, 
            ctx2 IN  t_f_concat) 
    RETURN NUMBER IS 
    BEGIN 
    SELF.g_string := SELF.g_string || '$' || ctx2.g_string; 
    RETURN ODCIConst.Success; 
    END; 
    end; 
+0

嘗試by子句子查詢外移動您的訂單。 –

+0

「TO_DATE()」的第一個參數是否與格式說明符「DD/MM/YY HH24:MI:SS」的格式完全相同? – hashbrown

+0

@hashbrown,to_date()產生一個日期對象。根據定義,它們沒有格式。 –

回答

0

試試這個:

WITH STRINGS 
    AS (SELECT 
      'Line 2' TEXT, 
      '10/12/2013 10:00:00' STRING1 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      'Line 1' TEXT, 
      '10/12/2013 11:00:00' STRING1 
     FROM 
      DUAL) 
SELECT 
     TEXT, 
     TO_DATE (STRING1, 
       'DD/MM/YY HH24:MI:SS') 
FROM 
     STRINGS 
ORDER BY 
     TO_DATE (STRING1, 
       'DD/MM/YY HH24:MI:SS'); 

輸出

Line 2 12/10/2013 10:00:00 AM 
Line 1 12/10/2013 11:00:00 AM 

PS:你可以在你的轉換,這將拋出的更新錯誤拼寫錯誤的MI和MM。如果您仍然遇到問題,請爲您獲得的功能和輸出提供示例輸入。同時解釋在這個函數中被調用的f_concat。

跟進:

這是錯誤的,這是你在你的選擇

SELECT 
     TO_DATE (TO_CHAR (SYSDATE), 
       'DD/MM/YY HH24:MI:SS') 
FROM 
     DUAL; 

輸出:

1/8/2014 

與此

替換它
SELECT 
     TO_DATE (TO_CHAR (SYSDATE, 
         'DD/MM/YY HH24:MI:SS'), 
       'DD/MM/YY HH24:MI:SS') 
FROM 
     DUAL; 

輸出:

1/8/2014 4:36:13 PM 
+0

感謝您的回答:我應該把這個放在哪裏?而不是什麼?你能解釋一下嗎?我檢查了MM和MI,並且我認爲它沒有錯誤。我添加f_concat。 –

+0

讓我的函數的工作輸入和輸出F_TRIDATE_CONCAT – SriniV

+0

'Name1-> Name2demandéle 02/12/13:Positif $ Name2-> Name3demandéle 02/12/13:Positif'在日期中使用日期格式 –