如何在Oracle中使用yyyymmddHH24miss插入日期到日期数据类型

时间:2018-10-30 13:23:49

标签: sql .net oracle

我正在插入一个称为testtable的表中,其中APPLICATION_DATE列是在插入日期,但由于不是有效月份而出现错误。如何更正它。此处APPLICATION_DATE是oracle date数据类型

insert into testtable(APPLICATION_DATE) VALUES(TO_DATE('20180118165335','mm/dd/yyyy'));

2 个答案:

答案 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需要解决类似的问题,如果它没有做同样的事情,我会感到惊讶。