【问题标题】:Changing the NLS_DATE_FORMAT in c#在 C# 中更改 NLS_DATE_FORMAT
【发布时间】:2021-10-25 22:29:42
【问题描述】:

我正在尝试更改查询的 NLS_DATE_FORMAT,但我正在努力这样做。
我使用了两种方法

第一个

// Use the command to change the format
OracleCommand cmd = new OracleCommand("ALTER SESSION SET NLS_DATE_FORMAT = \'YYYY-MM-DD\'", conn);
cmd.ExecuteNonQuery();

// Then do another command
OracleCommand mainCommand = new OracleCommand("SELECT * FROM dates_table", conn);
OracleDataReader reader = command.ExecuteReader();
while(reader.Read())
{
    // Read Data
}

此选项查询均成功,但日期格式仍包含时间(HH:MM:SS)

第二次

// Put both commands in the same sql statement
string sql = "ALTER SESSION SET NLS_DATE_FORMAT = \'YYYY-MM-DD\';";
sql += "SELECT * FROM dates_table";
OracleCommand command = new OracleCommand(sql, conn);
OracleDataReader reader = command.ExecuteReader();
while(reader.Read())
{
    // Read Data
}

此选项不成功,并给我错误ORA-0091,这似乎是第一条语句中的分号。我也试过删除分号,但它会产生ORA-00922 错误。

我现在有点卡住了,任何帮助将不胜感激。提前致谢!

【问题讨论】:

  • 您为什么要尝试使用NLS_DATE_FORMAT 对其进行格式化?只需将 C# 中的日期时间值格式化为您想要的格式即可。
  • 我同意;这是一个显示问题。做你的显示格式客户端。
  • @MT0 数据没有被更改为 c# DateTime 并且不能。我正在处理的查询并不总是相同的,我无法分辨什么是日期,什么不是。我希望我可以对每个访问的日期进行全面更改
  • @RobertHarvey 在查询期间是否有理由不这样做?
  • 是的,如果您实际上没有检索 DateTime 对象。大概那么,您只是从数据库中检索 TEXT ?您关于无法分辨什么是约会和什么不是约会的评论非常令人担忧;通常,数据库具有您可以依赖的稳定架构。

标签: c# oracle date


【解决方案1】:

oracle DATE 是二进制数据类型,并且 NOT 存储格式,因此当您在第 3 方应用程序(即 C#)中获取日期列时,您只会获取二进制数据表示年、月、日、小时、分钟和秒,而不是任何格式。

NLS_DATE_FORMAT 会话参数是 Oracle 将在用户会话中使用的内部格式,用于将日期隐式转换为(和从)字符串。

SQL/Plus 和 SQL Developer 客户端应用程序还使用 NLS_DATE_FORMAT 会话参数来控制如何向用户显示二进制日期值,但这种格式化是在客户端应用程序上完成的(而不是由 Oracle 数据库)。


如果要格式化 DATE 数据类型,请在 C# 中进行格式化。

如果您真的想在数据库中对其进行格式化,请使用TO_CHAR 将每个日期列(没有格式)转换为格式化字符串。

SELECT TO_CHAR(date_column, 'YYYY-MM-DD') AS formatted_date_column
FROM   dates_table

【讨论】:

  • 不知道 NLS_DATE_FORMAT 对显示值没有影响,谢谢
猜你喜欢
  • 2014-05-16
  • 2019-01-08
  • 2015-01-23
  • 2019-12-16
  • 2010-10-01
  • 2017-02-22
  • 2016-08-07
  • 2020-05-23
  • 2023-04-04
相关资源
最近更新 更多