2013-08-01 82 views
0

我很困惑,從這個問題。我們使用帶有存儲過程的Oracle DB,這些都是從C#調用的。比較日期與Oracle 11g存儲過程中的時間戳

這是存儲程序的問題部分:

IF pi_from_date IS NOT NULL THEN 
     where_part := where_part || 'and created_on >= ''' || pi_from_date || ''''; 
    END IF; 
    IF pi_to_date IS NOT NULL THEN 
     where_part := where_part || 'and created_on <= ''' || pi_to_date || ''''; 
    END IF; 

pi_from_date和pi_to_date在參數類型DATE的。 credated_on是TIMESTAMP的列類型。我從C#代碼調用此過程,並使用C#類型DateTime獲取pi_to_date和pi_from_date。 它不工作。我沒有得到任何結果,但在DB中有一些記錄。我嘗試了TO_DATE,TO_CHAR等函數,但沒有任何工作。有時候,我得到錯誤:

SQL Error: ORA-00904: "APR": invalid identifier

你能幫助我如何解決這個問題,好嗎? 謝謝。

編輯: 這裏是C#代碼:

var parameters = new OracleDynamicParameters(); 
parameters.Add("pi_from_date", filterData.From); //DateTime.Now.AddMonths(-1); 
parameters.Add("pi_to_date", filterData.To); //DateTime.Now.AddMonths(1); 

var payments = conn.Query<Payment>("TEST_PCG.find_proc", parameters, commandType: commandType.StoredProcedure); 

在DB與日期2013年8月1日的記錄。

存儲過程:

PROCEDURE find_proc (pi_from_date   IN DATE, 
          pi_to_date    IN DATE, 
          items_ret    OUT sys_refcursor) 
AS 
    stmt varchar2(32767); 
    where_part varchar2(32767); 
BEGIN 
    -- select statement part 
    stmt := 'SELECT * FROM (SELECT a.*, rownum r__ FROM (SELECT * FROM Payment WHERE 1=1 ';   

    -- where statement part 
    IF pi_from_date IS NOT NULL THEN 
     where_part := where_part || 'and created_on >= ''' || pi_from_date || ''''; 
    END IF; 
    IF pi_to_date IS NOT NULL THEN 
     where_part := where_part || 'and created_on <= ''' || pi_to_date || ''''; 
    END IF; 
    stmt := stmt || where_part; 

    -- get ref cursor from query 
    OPEN items_ret FOR stmt; 
END find_proc; 
+0

您應該使用類型正確,parameratized變量相同的日期格式而不是將日期作爲字符串傳遞,或者通過構建字符串來動態創建SQL語句。請顯示您的代碼的C#部分。還請顯示其餘的sproc - 至少我們可以看到整個語句是如何構建和執行的。 –

+0

請將您的C#調用設置顯示給此過程以及過程聲明。 – OldProgrammer

回答

0

您的動態SQL考慮您的日期值作爲一個字符串,並根據你的機器上,C#將日期轉換爲字符串的不同格式(例如DD/MM/YYYY,DD -MM-YYYY ..等等),所以你也需要指定。如果你必須使用d-SQL那麼你的where子句應該轉換您使用TO_DATE傳遞給一個日期的日期值,並有要轉換到C#