Oracle数据库使用NLS(National Language Support)参数来控制日期和时间的显示格式,主要包括:
SELECT * FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER IN ('NLS_DATE_FORMAT', 'NLS_TIMESTAMP_FORMAT', 'NLS_TIMESTAMP_TZ_FORMAT');
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_DATE_FORMAT', 'NLS_TIMESTAMP_FORMAT', 'NLS_TIMESTAMP_TZ_FORMAT');
SELECT * FROM NLS_INSTANCE_PARAMETERS
WHERE PARAMETER IN ('NLS_DATE_FORMAT', 'NLS_TIMESTAMP_FORMAT', 'NLS_TIMESTAMP_TZ_FORMAT');
-- 修改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';
编辑init.ora
或spfile.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 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;
注意:系统级修改需要重启数据库才能生效。
在客户端环境中设置环境变量:
# 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 | 时区分钟 |
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS CURRENT_TIME FROM DUAL;
INSERT INTO table_name (date_column)
VALUES (TO_DATE('2023-05-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS'));
SELECT * FROM orders
WHERE order_date > TO_DATE('2023-01-01', 'YYYY-MM-DD');
问题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数据库中日期和时间的显示格式,满足各种业务需求。