You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle数据库日期显示异常及获取最后修改日期的C#代码问题

解决Oracle日期读取后显示异常的问题

这个问题很典型,核心原因是日期类型处理不当+文化差异导致的格式解析错误:Oracle里存储的04-DEC-20是12月4日,但你的C#代码用GetValue返回的object在ToString时,可能因为当前线程的文化设置不识别英文月份缩写DEC,错误地把它解析成了9月(比如某些非英文文化里没有DEC这个缩写,或者默认解析逻辑出了问题),最终变成了04-09-2020。

下面是具体的修复方案,分两种场景处理:

场景1:LASTMODIFIED是Oracle DATE类型(推荐)

如果你的表中LASTMODIFIED字段是Oracle原生的DATE类型,直接用GetDateTime方法读取,确保拿到正确的DateTime对象,再指定格式输出:

string connString = DBUtils.GetDBConnection(); 
// 用using自动释放连接资源,避免泄漏
using (OracleConnection conn = new OracleConnection(connString))
{
    string sql = "select LASTMODIFIED , name from v_vname where name in('hector')"; 
    using (OracleCommand cmd = new OracleCommand(sql, conn))
    {
        conn.Open(); 
        using (DbDataReader reader = cmd.ExecuteReader()) 
        { 
            if (reader.HasRows) 
            { 
                while (reader.Read()) 
                { 
                    int dateOrdinal = reader.GetOrdinal("LASTMODIFIED");
                    // 直接读取为DateTime类型,绕开object转义的不确定性
                    DateTime lastModified = reader.GetDateTime(dateOrdinal);
                    // 用InvariantCulture确保英文月份缩写被正确识别和输出
                    Console.WriteLine("modifieddate:" + lastModified.ToString("dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture));
                    // 如果需要完整年份格式,可替换为:
                    // Console.WriteLine("modifieddate:" + lastModified.ToString("dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture));
                } 
            } 
        }
    }
}

场景2:LASTMODIFIED是字符串类型(不推荐,但如果是这种情况)

如果字段是用字符串存储的日期,需要用ParseExact指定解析格式和文化,彻底避免歧义:

string connString = DBUtils.GetDBConnection(); 
using (OracleConnection conn = new OracleConnection(connString))
{
    string sql = "select LASTMODIFIED , name from v_vname where name in('hector')"; 
    using (OracleCommand cmd = new OracleCommand(sql, conn))
    {
        conn.Open(); 
        using (DbDataReader reader = cmd.ExecuteReader()) 
        { 
            if (reader.HasRows) 
            { 
                while (reader.Read()) 
                { 
                    int dateOrdinal = reader.GetOrdinal("LASTMODIFIED");
                    string dateStr = reader.GetString(dateOrdinal);
                    // 明确指定解析格式为dd-MMM-yy,并用InvariantCulture确保DEC被识别为12月
                    DateTime lastModified = DateTime.ParseExact(dateStr, "dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture);
                    Console.WriteLine("modifieddate:" + lastModified.ToString("dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture));
                } 
            } 
        }
    }
}

额外注意事项

  • 尽量用Oracle原生DATE/TIMESTAMP类型存储日期,不要用字符串,从根源避免格式解析的各种问题。
  • 操作日期时始终指定CultureInfo.InvariantCulture(或明确指定en-US文化),避免系统默认文化带来的解析/输出偏差。
  • 代码中务必用using语句自动释放资源(修复代码中已补充,原代码里的OracleConnection未用using,存在资源泄漏风险)。

内容的提问来源于stack exchange,提问作者manvitha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:04:48