【问题标题】:Can't permanently change SYSDATE Format无法永久更改 SYSDATE 格式
【发布时间】:2016-10-25 09:52:48
【问题描述】:

我想更改 Oracle 的日期格式 现在是 DD/MM/YYYY,我想改成 MM/DD/YYYY

我使用了一个简单的代码(谢谢 google)

ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YYYY HH24:MI';
select sysdate from dual;

问题是当我断开并重新连接时,更改被取消,

有什么帮助吗?

主要的改变是让 Oracle 接受格式为 MM/DD/YYYY 的插入日期

提前致谢

【问题讨论】:

  • 您应该在插入期间指定格式(使用to_date()),而不是依赖隐式转换和 NLS 设置。您可以更改会话的默认格式 - 您使用的是哪个客户端? - 但有一天别人会运行你的代码,它会崩溃。
  • ALTER SESSION 言行一致:它改变的是当前会话(=连接),而不是系统。

标签: oracle sysdate


【解决方案1】:

正如您在命令中看到的那样,您正在更改会话。因此,重新连接后,您将拥有获取服务器设置的新会话。为了更好地理解,请阅读: https://docs.oracle.com/cd/A87860_01/doc/server.817/a76966/ch2.htm

我建议始终使用 to_date(data_string,'MM/DD/YYYY HH24:MI') 插入日期,并且不要相信 NLS 不会更改。

【讨论】:

  • 对不起,我的数据库管理员不是很好,你能给我完整的查询吗?
  • @HamzaAmami 而不是insert into T (datefield) values ('10/21/2016 23:10') 请使用insert into T (datefield) values (to_date('10/21/2016 23:10',''MM/DD/YYYY HH24:MI')) 其他方式意味着你需要更改数据库设置或环境变量,如果你对管理没有很好的理解,你不应该这样做
【解决方案2】:

如果您使用的是 SQL*Plus,您可以在 glogin.sql 或 login.sql 文件中添加设置 nls_date_format 的命令 - 请参阅this helpful guide

但是,如果您的要求是“让 Oracle 接受格式为 MM/DD/YYYY 的插入日期”,为什么不简单地在插入时将字符串转换为日期,例如:

insert into some_table (id, date_col)
values (1, to_date('10/25/2016', 'mm/dd/yyyy'));

这样,您无需担心格式问题;它会自动采用正确的格式。

【讨论】:

    【解决方案3】:

    您也可以在注册表中设置此格式

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_{Oracle Home Name}\NLS_DATE_FORMAT,

    分别。

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_{Oracle Home Name}\NLS_DATE_FORMAT

    从命令行执行此操作的示例:

    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1" /v NLS_DATE_FORMAT /t REG_SZ /d "MM/DD/YYYY HH24:MI" /f
    

    另一种可能是将值设置为环境变量,例如:

    set NLS_DATE_FORMAT="MM/DD/YYYY HH24:MI"
    

    注意,环境变量优先于注册表设置。

    但请注意,这些只是定义了NLS_DATE_FORMAT默认 值。可以随时通过ALTER SESSION SET NLS_DATE_FORMAT = ...命令修改。

    【讨论】:

    • 感谢您的回答,问题是我在两个 reg 中都没有 NLS_DATE_FORMAT 如何将其设置为和环境变量?
    • 您真的问如何在注册表中设置(或添加)值或如何定义环境变量?谷歌“为注册表添加价值”,你会得到数百个例子。
    【解决方案4】:

    执行 ALTER SYSTEM 而不是 SESSION:

    ALTER SYSTEM SET NLS_DATE_FORMAT='MM/DD/YYYY' scope=both;
    

    或:

    ALTER SYSTEM SET NLS_DATE_FORMAT='MM/DD/YYYY';
    

    更多信息here

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2013-10-07
      • 2017-10-04
      相关资源
      最近更新 更多