ODP.NET:将 Oracle 日期格式设置为"output-only"格式



我想在 C# 中使用 Oracle 日期格式,例如在 to_char(date, format) 中,无需数据库连接,也没有编写自己的格式解释器。

示例应用程序(我使用的是适用于 .NET 的 Oracle Data Provider(:

namespace OracleDateToCharTest
{
    using System;
    using Oracle.DataAccess.Client;
    using Oracle.DataAccess.Types;
    class Program
    {
        /// <param name="fmt"> Oracle-like format string. </param>
        public static string OracleDateToChar(DateTime date, string fmt)
        {
            //// preparing format for ToString()
            OracleGlobalization og = OracleGlobalization.GetThreadInfo();
            string prevFormat = og.DateFormat;
            og.DateFormat = fmt;
            try
            {
                //// converting to OracleDate
                OracleDate odacDate = new OracleDate(date); 
                //// setting format for ToString()
                OracleGlobalization.SetThreadInfo(og);
                return odacDate.ToString();
            }
            catch (OracleTypeException ex)
            {
                if (ex.Number == 1820)
                {
                    //// described issue
                }
                throw;
            }
            finally
            {
                og.DateFormat = prevFormat;
                OracleGlobalization.SetThreadInfo(og);
            }
        }
        static void Main(string[] args)
        {
            var x = OracleDateToChar(DateTime.Now, "mm-dd-yyyy");
            var y = OracleDateToChar(DateTime.Now, "mm-dd-yyyy HH24:Mi:ss");
            var z = OracleDateToChar(DateTime.Now, "IW"); //// exception
        }
    }
}

它适用于 "mm-dd-yyyy""mm-dd-yyyy HH24:Mi:ss" 等格式,但不幸的是,它不适用于 "IW" 等"仅输出"格式(仅输出格式是您可以在 TO*_DATETIME 功能中指定的格式,根据 http://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm 上的表 9-4(。

例如,当我打电话时

OracleDateToChar(DateTime.Now, "IW")

我在ToString()行中得到ORA-01820 format code cannot appear in date input format例外。

如果我ToDate()方法中遇到此错误,我会理解,但ToString()这似乎是 ODP.NET 中的一个错误。

问:有没有办法实现OracleDateToChar可以处理仅输出格式的方法?(假设从 Oracle 数据库调用select to_char(:date, :fmt) from nvl;不是一种选择(

关于Oracle

文档的要点是它适用于作为Oracle语言一部分的DATE_FORMAT。因此,您只能将其作为PL/SQL语句执行,这就是为什么您无法使其在客户端工作的原因:据我所知,IW不是 ODP.Net 全球化的有效格式掩码。实际上,ODP 全球化 DateFormat 默认为本地NLS_DATE_FORMAT中的任何内容,这是一个完整的日期格式字符串,而IW用于获取一年中的一周,而不是用于格式化日期本身。据我所知,.Net 框架中的任何内容都不会识别特定于 Oracle 的字符串,因此为了使它正常工作,您需要向 Oracle 发出命令并返回结果,如该页面上的示例所示:

CONSIDER mydatetime
DATE_FORMAT MON-RRRR-DD-HH24

更改日期格式似乎有点矫枉过正。在这个SO答案中,有一些很好的替代信号是客户端.Net

延伸阅读

Oracle

Date Structure(OracleDate(ToString()方法的Oracle文档指出:

返回值是 OracleDate 中的字符串表示形式 由线程的 OracleGlobalization.DateFormat 指定的格式 财产

(我的强调(。可以在此处找到此定义。一个有用的NLS_DATE_FORMAT格式字符串列表,因此扩展OracleDate.ToString,可以在这里找到。

相关内容

  • 没有找到相关文章

最新更新