我想在 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语言一部分的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
。延伸阅读
OracleDate Structure(OracleDate
(ToString()
方法的Oracle文档指出:
返回值是 OracleDate 中的字符串表示形式 由线程的 OracleGlobalization.DateFormat 指定的格式 财产
(我的强调(。可以在此处找到此定义。一个有用的NLS_DATE_FORMAT
格式字符串列表,因此扩展OracleDate.ToString
,可以在这里找到。