插件窝 干货文章 Oracle时间格式修改方法详解

Oracle时间格式修改方法详解

FORMAT TIMESTAMP 格式 NLS 422    来源:    2025-04-09

Oracle时间格式修改方法详解

一、Oracle时间格式概述

Oracle数据库使用NLS(National Language Support)参数来控制日期和时间的显示格式,主要包括:

  1. NLS_DATE_FORMAT:控制DATE类型的显示格式
  2. NLS_TIMESTAMP_FORMAT:控制TIMESTAMP类型的显示格式
  3. NLS_TIMESTAMP_TZ_FORMAT:控制TIMESTAMP WITH TIME ZONE类型的显示格式

二、查看当前时间格式

1. 查看会话级时间格式

SELECT * FROM NLS_SESSION_PARAMETERS 
WHERE PARAMETER IN ('NLS_DATE_FORMAT', 'NLS_TIMESTAMP_FORMAT', 'NLS_TIMESTAMP_TZ_FORMAT');

2. 查看数据库级时间格式

SELECT * FROM NLS_DATABASE_PARAMETERS 
WHERE PARAMETER IN ('NLS_DATE_FORMAT', 'NLS_TIMESTAMP_FORMAT', 'NLS_TIMESTAMP_TZ_FORMAT');

3. 查看实例级时间格式

SELECT * FROM NLS_INSTANCE_PARAMETERS 
WHERE PARAMETER IN ('NLS_DATE_FORMAT', 'NLS_TIMESTAMP_FORMAT', 'NLS_TIMESTAMP_TZ_FORMAT');

三、修改时间格式的方法

1. 会话级修改(仅影响当前会话)

-- 修改DATE格式
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

-- 修改TIMESTAMP格式
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';

-- 修改TIMESTAMP WITH TIME ZONE格式
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM';

2. 系统级修改(影响所有会话)

方法一:修改初始化参数文件

编辑init.oraspfile.ora文件,添加或修改以下参数:

NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF'
NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF TZH:TZM'

方法二:使用ALTER SYSTEM命令

ALTER SYSTEM SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' SCOPE=SPFILE;
ALTER SYSTEM SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF' SCOPE=SPFILE;
ALTER SYSTEM SET NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF TZH:TZM' SCOPE=SPFILE;

注意:系统级修改需要重启数据库才能生效。

3. 环境变量修改(客户端工具)

在客户端环境中设置环境变量:

# Linux/Unix
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
export NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF'
export NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF TZH:TZM'

# Windows
set NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS
set NLS_TIMESTAMP_FORMAT=YYYY-MM-DD HH24:MI:SS.FF
set NLS_TIMESTAMP_TZ_FORMAT=YYYY-MM-DD HH24:MI:SS.FF TZH:TZM

四、常用时间格式元素

格式元素 说明
YYYY 4位年份
YY 2位年份
MM 月份(01-12)
MON 月份的缩写(JAN-DEC)
MONTH 月份的全名
DD 月中的日(01-31)
DDD 年中的日(001-366)
DY 星期的缩写(SUN-SAT)
DAY 星期的全名
HH 小时(01-12)
HH24 小时(00-23)
MI 分钟(00-59)
SS 秒(00-59)
FF 小数秒(1-9位)
AM/PM 上午/下午指示符
TZH 时区小时
TZM 时区分钟

五、实际应用示例

1. 查询时格式化输出

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS CURRENT_TIME FROM DUAL;

2. 插入数据时指定格式

INSERT INTO table_name (date_column) 
VALUES (TO_DATE('2023-05-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS'));

3. 比较日期时使用统一格式

SELECT * FROM orders 
WHERE order_date > TO_DATE('2023-01-01', 'YYYY-MM-DD');

六、注意事项

  1. 修改系统级参数需要DBA权限
  2. 某些客户端工具(如SQL*Plus)会覆盖会话设置
  3. 不同级别的设置优先级:会话级 > 环境变量 > 实例级 > 数据库级
  4. 修改时间格式不会影响数据库中存储的数据,只影响显示方式

七、常见问题解决

问题1:ORA-01843: 无效的月份

原因:输入的日期字符串与当前NLS_DATE_FORMAT不匹配

解决方案

-- 明确指定格式转换
SELECT TO_DATE('15-MAY-2023', 'DD-MON-YYYY') FROM DUAL;

问题2:时间显示不包含时间部分

原因:NLS_DATE_FORMAT可能只包含日期部分

解决方案

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

问题3:TIMESTAMP的小数秒不显示

原因:NLS_TIMESTAMP_FORMAT未包含FF元素

解决方案

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';

通过以上方法,您可以灵活地控制Oracle数据库中日期和时间的显示格式,满足各种业务需求。