【问题标题】:Compare Date with Timestamp in oracle 11g stored procedure在 oracle 11g 存储过程中比较日期和时间戳
【发布时间】:2013-08-02 16:57:54
【问题描述】:

我对这个问题感到非常困惑。我们使用带有存储过程的 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# 代码调用此过程,并将 C# 类型 DateTime 用于 pi_to_date 和 pi_from_date。 它不工作。我没有得到任何结果,但在 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;

【问题讨论】:

  • 您应该使用正确类型的参数化变量,而不是将日期作为字符串传递,或者通过构建字符串来动态创建 SQL 语句。请显示代码的 C# 部分。还请显示 sproc 的其余部分 - 至少这样我们才能看到整个语句是如何构建和执行的。
  • 请显示您对该过程的 C# 调用设置,以及过程声明。

标签: c# oracle datetime timestamp


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2019-05-18
    • 1970-01-01
    相关资源
    最近更新 更多