Oracle中如何将字符串转换为DATE类型?(C#读Excel场景)
解决C#读取的年月字符串转Oracle DATE类型的方法
有两种常用方案,分别在C#端转换后插入,或直接在Oracle端转换:
方案一:C#端先转换为DateTime再参数化插入
因为Oracle的DATE类型需要包含年、月、日,所以先把2015.08这类字符串解析为C#的DateTime(默认取当月第一天),再通过参数化命令插入,避免SQL注入和格式错误:
// 读取到的Excel年月字符串 string excelDateStr = "2015.08"; // 解析为DateTime,格式匹配"yyyy.MM" DateTime manufactureDate = DateTime.ParseExact(excelDateStr, "yyyy.MM", CultureInfo.InvariantCulture); // manufactureDate此时为2015-08-01 00:00:00 // 构建Oracle参数化插入语句 string sql = "INSERT INTO your_table (manufacturedate) VALUES (:ManuDate)"; using (OracleConnection conn = new OracleConnection("your_connection_string")) { conn.Open(); using (OracleCommand cmd = new OracleCommand(sql, conn)) { // 指定参数类型为Oracle DATE cmd.Parameters.Add(":ManuDate", OracleDbType.Date).Value = manufactureDate; cmd.ExecuteNonQuery(); } }
方案二:Oracle端使用TO_DATE函数转换
如果直接传递字符串到Oracle,可以用Oracle内置的TO_DATE函数,指定匹配的格式模型'YYYY.MM',Oracle会自动将日部分补为当月第一天:
-- 假设参数:ManuDateStr是C#传递的"2015.08"字符串 INSERT INTO your_table (manufacturedate) VALUES (TO_DATE(:ManuDateStr, 'YYYY.MM'));
在C#中同样要使用参数化传递字符串,不要直接拼接SQL:
string excelDateStr = "2015.08"; string sql = "INSERT INTO your_table (manufacturedate) VALUES (TO_DATE(:ManuDateStr, 'YYYY.MM'))"; using (OracleConnection conn = new OracleConnection("your_connection_string")) { conn.Open(); using (OracleCommand cmd = new OracleCommand(sql, conn)) { cmd.Parameters.Add(":ManuDateStr", OracleDbType.Varchar2).Value = excelDateStr; cmd.ExecuteNonQuery(); } }
注意事项
- 无论哪种方案,必须使用参数化查询,禁止直接拼接SQL字符串,防止SQL注入,同时避免因区域设置导致的格式解析错误。
- Oracle的
DATE类型包含时间部分,如果不需要时间,两种方案生成的日期默认时间为00:00:00,符合常规需求。
内容的提问来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

