在oracle 11g存储过程中将Date与Timestamp进行比较

时间:2013-08-01 16:32:30

标签: c# oracle datetime timestamp

我对此问题非常困惑。我们使用Oracle DB和存储过程,这些是从C#调用的。

这是存储过程中存在问题的一部分:

  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的IN参数类型。 credated_on是TIMESTAMP的列类型。我从C#代码调用此过程,并对pi_to_date和pi_from_date使用C#type DateTime。 它不起作用。我没有得到任何结果,但在DB中有一些记录。我尝试了像TO_DATE,TO_CHAR这样的函数,但没有任何工作。有时我会收到错误:

  

SQL错误:ORA-00904:“APR”:标识符无效

你能帮我解决这个问题吗? 感谢。

修改 这是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中是日期为1.8.2013的记录。

存储过程:

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;

1 个答案:

答案 0 :(得分:0)

您的动态SQL将日期值视为字符串,并且根据您的计算机,C#会将日期转换为不同的字符串格式(例如dd / mm / yyyy,DD-MM-YYYY..etc),因此您需要同样指定。如果必须使用D-SQL,则where子句应使用TO_DATE将传递的日期值转换为日期,并且具有与在C#中转换为的日期格式相同的日期格式