我正在插入一个称为testtable
的表中,其中APPLICATION_DATE
列是在插入日期,但由于不是有效月份而出现错误。如何更正它。此处APPLICATION_DATE
是oracle date
数据类型
insert into testtable(APPLICATION_DATE) VALUES(TO_DATE('20180118165335','mm/dd/yyyy'));
答案 0 :(得分:2)
如果您输入的值为20180118165335
,则格式掩码应类似于
insert into testtable(APPLICATION_DATE) VALUES(TO_DATE('20180118165335','yyyymmddhh24miss'));
答案 1 :(得分:2)
查看问题上的.Net
标签。如果您使用.Net并担心格式化要在SQL中使用的字符串值,那么您将遇到这种非常错误的情况。不清楚您使用的是ODP.Net还是OracleClient,但是无论哪种方式,您都想要首先将值解析为.Net DateTime对象。假设使用C#,但是VB.Net代码并没有很大不同:
string input = "20180118165335";
DateTime output = DateTime.ParseExact(input, "yyyyMMddHHmmss", CultureInfo.InvariantCulture));
一旦有了DateTime值,就可以像这样构建SQL字符串:
string sql = "INSERT INTO testtable(APPLICATION_DATE) VALUES ( :AppDate );";
请注意该字符串多么简单。没有转换。不用担心格式。 没有串联。只是一个占位符。
然后使用如下两个变量:
using (var cn = new OracleConnection("connection string here"))
using (var cmd new OracleCommand(sql, cn))
{
cmd.BindByName = true;
cmd.Parameters.Add(":AppDate", OracleDbType.Date).Value = output;
cn.Open();
cmd.ExecuteNonQuery();
}
此示例的一个重要功能是将output
值直接从不替换为SQL命令文本,甚至在服务器上也是如此。这样可以防止任何可能的SQL注入攻击。此外,以这种方式使用查询参数可确保正确转换为Oracle Date
值,而无需担心格式混乱。
这也往往会表现得更好,因为现在数据库服务器可以缓存执行计划。我们通常在引用Sql Server时谈论此问题,但是Oracle需要解决类似的问题,如果它没有做同样的事情,我会感到惊讶。