2013-08-01 78 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#