3 回答
TA贡献1877条经验 获得超6个赞
(以及其他设置)派生自 。因此,当您设置区域时,数据库还会将日期格式设置为此区域的默认格式:nls_date_formatnls_territory
select value from nls_session_parameters
where parameter = 'NLS_DATE_FORMAT';
VALUE
--------------------------------------------------------------------------------
DD-MON-RR
ALTER SESSION SET NLS_TERRITORY = 'CIS';
select value from nls_session_parameters
where 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_parameters
where 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
TA贡献1155条经验 获得超0个赞
Oracle 的默认日期格式取决于设置。因此,当您设置时,您还告诉Oracle将(和其他类似参数)重置为新区域的默认值。NLS_TERRITORY
NLS_TERRITORY
NLS_DATE_FORMAT
从甲骨文文档中:
1.206 NLS_TERRITORY
NLS_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';
TA贡献1876条经验 获得超7个赞
除了其他答案之外,您还应该将设置合并到一个语句中:ALTER SESSION
ALTER 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 here
end;
这可以通过一次调用执行,因此只需要一次往返。oci_parse()
- 3 回答
- 0 关注
- 106 浏览
添加回答
举报