甲骨文NLS_TERRITORY覆盖NLS_DATE_FORMAT

在 PHP 应用程序中,我指定


ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';

输出数据格式是预期的 2020-01-31 21:21:47 但是当我添加


ALTER SESSION SET NLS_TERRITORY = 'CIS';

NLS_DATE_FORMAT不起作用,NLS_TERRITORY会覆盖它。31.01.20


富国沪深
浏览 107回答 3
3回答

慕哥9229398

(以及其他设置)派生自 。因此,当您设置区域时,数据库还会将日期格式设置为此区域的默认格式:nls_date_formatnls_territoryselect value from nls_session_parameterswhere  parameter = 'NLS_DATE_FORMAT';VALUE--------------------------------------------------------------------------------DD-MON-RRALTER SESSION SET NLS_TERRITORY = 'CIS';select value from nls_session_parameterswhere  parameter = 'NLS_DATE_FORMAT';VALUE--------------------------------------------------------------------------------DD.MM.RR因此,您需要在区域之后设置日期格式:ALTER SESSION SET NLS_TERRITORY = 'CIS';ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';select value from nls_session_parameterswhere  parameter = 'NLS_DATE_FORMAT';VALUE--------------------------------------------------------------------------------YYYY-MM-DD HH24:MI:SS或者 - 更好的是 - 在转换中使用显式格式掩码:ALTER SESSION SET NLS_TERRITORY = 'CIS';select sysdate, to_char ( sysdate, 'YYYY-MM-DD HH24:MI:SS' ) from dual;SYSDATE  TO_CHAR(SYSDATE,'YY-------- -------------------07.02.20 2020-02-07 09:25:35

白衣非少年

Oracle 的默认日期格式取决于设置。因此,当您设置时,您还告诉Oracle将(和其他类似参数)重置为新区域的默认值。NLS_TERRITORYNLS_TERRITORYNLS_DATE_FORMAT从甲骨文文档中:1.206 NLS_TERRITORYNLS_TERRITORY指定日和周编号应遵循其约定的领土名称。...此参数还建立默认日期格式、默认小数字符和组分隔符以及默认 ISO 和本地货币符号。有关这些设置的信息,请参阅“NLS_DATE_FORMAT”、“NLS_NUMERIC_CHARACTERS”、“NLS_CURRENCY”和“NLS_ISO_CURRENCY”。如果要更改区域和日期语言 &格式,则需要先更改区域(这会将 等的值隐式更改为区域的默认值),然后您可以更改日期语言 &格式以覆盖这些默认区域设置:NLS_DATE_FORMAT所以:ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';ALTER SESSION SET NLS_TERRITORY = 'CIS';应该是:ALTER SESSION SET NLS_TERRITORY = 'CIS';ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';

幕布斯6054654

除了其他答案之外,您还应该将设置合并到一个语句中:ALTER SESSIONALTER SESSION SET NLS_TERRITORY = 'CIS' NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_DATE_LANGUAGE = 'RUSSIAN';如果您从 PHP 执行语句(而不仅仅是通过 PL/SQL 块或登录触发器),则特别建议这样做,因为它减少了 PHP 和数据库之间的往返次数,并且可以显著提高性能。有关使用触发器的讨论,请参阅免费的甲骨文 PDF 地下 PHP 和甲骨文手册的第 304 页。如果您确实需要从 PHP 执行该语句,并且有其他 SQL 命令在登录时执行,请将它们全部包装在一个匿名的 PL/SQL 块中:begin     execute immediate       'alter session set nls_date_format = ''YYYY-MM-DD'' nls_language = AMERICAN';     -- other SQL statements could be put hereend;这可以通过一次调用执行,因此只需要一次往返。oci_parse()
打开App,查看更多内容
随时随地看视频慕课网APP