【问题标题】:Oracle.ManagedDataAccess.Client.OracleException: 'ORA-01830: date format picture ends before converting entire input string'Oracle.ManagedDataAccess.Client.OracleException: 'ORA-01830: 日期格式图片在转换整个输入字符串之前结束'
【发布时间】:2020-03-08 10:39:32
【问题描述】:

我遇到了错误

Oracle.ManagedDataAccess.Client.OracleException: 'ORA-01830: 日期格式图片在转换整个输入字符串之前结束'

在通过 c# 代码和 oracle 查询查找卷时:

public DataTable empcount(string strtdate, string enddate)
{

        string cString = ConfigurationManager.ConnectionStrings["greft"].ToString();

        OracleConnection conn = new OracleConnection(cString);
        OracleCommand cmd2 = new OracleCommand();
        cmd2.CommandText = "Select (sum(emp)) from emp_rec where emp_typ = 'M'and emp_stat!= 'ON'and trunc(join_start) >= TO_CHAR(TO_DATE(:sdate, 'DD-MM-YY'), 'DD-MON-YY') and trunc(join_end) <= TO_CHAR(TO_DATE(:edate, 'DD-MM-YY'), 'DD-MON-YY') ";
        cmd2.Parameters.Add(":sdate", strtdate);
        cmd2.Parameters.Add(":edate", enddate);
        cmd2.Connection = conn;
        OracleDataAdapter da = new OracleDataAdapter(cmd2);
        DataTable dt = new DataTable();           
        da.Fill(dt);
        conn.Dispose();
        return dt;
}

在表格中,join_startjoin_end 的日期格式为“02-MAY-2019”。 :sdate & :edate 输入将采用 mm/dd/yyyy 格式(例如 05/01/2019)。

【问题讨论】:

  • 而不是字符串,最好在Oracle端的C#相关类型中使用DateTime,另一方面,您的'02-MAY-201905/01/2019字符串格式显然不匹配。

标签: c# .net oracle


【解决方案1】:

REQ_START_TIME 列的数据类型为 VARCHAR2(11),其值如 02-MAY-2019

参数值sdate是一个String,其值为05/01/2019

我发现两个问题

截断字符列

trunc(REQ_START_TIME) - 你应该在截断之前将字符串转换为DATE(或者更好地将值存储在DATE 列中!)

为值 05/01/2019 屏蔽“DD-MM-YY”

将谓词转换为

where trunc(to_date(REQ_START_TIME,'DD-MON-YYYY')) >=  TO_DATE(:sdate, 'DD/MM/YYYY')

一般建议 - 不要在数据库的字符列中存储 DATE

【讨论】:

  • @shekhar 如有疑问,请将sdate 作为字符串传递(例如05/01/2019)并让数据库将其转换为DATE。我更新了答案。
  • 据我了解,我也这样做了。你能在这里把代码分享给我吗
  • 删除Convert.ToDateTime(strtdate)并重试@shekhar
猜你喜欢
  • 2019-04-25
  • 2010-10-10
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多