我很困惑,從這個問題。我們使用帶有存儲過程的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;
您應該使用類型正確,parameratized變量相同的日期格式而不是將日期作爲字符串傳遞,或者通過構建字符串來動態創建SQL語句。請顯示您的代碼的C#部分。還請顯示其餘的sproc - 至少我們可以看到整個語句是如何構建和執行的。 –
請將您的C#調用設置顯示給此過程以及過程聲明。 – OldProgrammer