插件窝 干货文章 Oracle时间格式调整教程

Oracle时间格式调整教程

SELECT 格式 日期 dual 327    来源:    2025-04-09

Oracle时间格式调整教程

基本时间格式函数

TO_CHAR函数(日期转字符串)

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
-- 结果:2023-11-15 14:30:45

TO_DATE函数(字符串转日期)

SELECT TO_DATE('2023-11-15 14:30:45', 'YYYY-MM-DD HH24:MI:SS') FROM dual;

常用时间格式元素

格式元素 说明 示例
YYYY 4位年份 2023
YY 2位年份 23
MM 月份(01-12) 11
MON 月份缩写 NOV
MONTH 月份全称 NOVEMBER
DD 月中的日(01-31) 15
D 周中的日(1-7) 3 (星期三)
DY 星期缩写 WED
DAY 星期全称 WEDNESDAY
HH24 24小时制(00-23) 14
HH 12小时制(01-12) 02
MI 分钟(00-59) 30
SS 秒(00-59) 45
FF 毫秒 123
AM/PM 上午/下午 PM

实际应用示例

1. 显示当前日期和时间

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

2. 显示季度信息

SELECT TO_CHAR(SYSDATE, 'Q') AS quarter FROM dual; -- 1-4表示季度

3. 显示周数

SELECT TO_CHAR(SYSDATE, 'WW') AS week_of_year FROM dual; -- 1-53
SELECT TO_CHAR(SYSDATE, 'IW') AS iso_week FROM dual; -- ISO标准周数(1-52/53)

4. 自定义格式显示

SELECT TO_CHAR(SYSDATE, 'Day, Month DD, YYYY "at" HH24:MI:SS') 
AS formatted_date FROM dual;
-- 结果:Wednesday, November 15, 2023 at 14:30:45

5. 从字符串解析日期

SELECT TO_DATE('15-Nov-2023', 'DD-Mon-YYYY') FROM dual;

6. 日期计算后格式化

SELECT TO_CHAR(SYSDATE + 7, 'YYYY-MM-DD') AS next_week FROM dual;

修改会话级别日期格式

查看当前会话日期格式

SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT';

临时修改会话日期格式

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

永久修改日期格式(需DBA权限)

ALTER SYSTEM SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' SCOPE=SPFILE;
-- 修改后需要重启数据库生效

处理时间戳(TIMESTAMP)数据

时间戳格式化

SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3') FROM dual;
-- 结果:2023-11-15 14:30:45.123

字符串转时间戳

SELECT TO_TIMESTAMP('2023-11-15 14:30:45.123', 'YYYY-MM-DD HH24:MI:SS.FF3') FROM dual;

常见问题解决

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

原因:月份格式不匹配 解决方案

-- 错误示例
SELECT TO_DATE('15-11-2023', 'DD-MM-YYYY') FROM dual; -- 月份格式应为数字

-- 正确示例
SELECT TO_DATE('15-Nov-2023', 'DD-Mon-YYYY') FROM dual; -- 或使用数字月份

问题2:ORA-01830 - 日期格式图片在转换整个输入字符串之前结束

原因:格式字符串与输入字符串不匹配 解决方案

-- 错误示例
SELECT TO_DATE('2023-11-15 14:30:45', 'YYYY-MM-DD') FROM dual;

-- 正确示例
SELECT TO_DATE('2023-11-15 14:30:45', 'YYYY-MM-DD HH24:MI:SS') FROM dual;

问题3:时区转换问题

解决方案

SELECT FROM_TZ(CAST(TO_DATE('2023-11-15 14:30:45', 'YYYY-MM-DD HH24:MI:SS') AS TIMESTAMP), 'UTC') 
AT TIME ZONE 'America/New_York' FROM dual;

高级应用

提取日期部分

SELECT EXTRACT(YEAR FROM SYSDATE) AS year,
       EXTRACT(MONTH FROM SYSDATE) AS month,
       EXTRACT(DAY FROM SYSDATE) AS day
FROM dual;

计算两个日期之间的差异

SELECT (TO_DATE('2023-12-31', 'YYYY-MM-DD') - TO_DATE('2023-11-15', 'YYYY-MM-DD')) AS days_diff FROM dual;

使用INTERVAL进行日期运算

SELECT SYSDATE + INTERVAL '1' YEAR AS next_year,
       SYSDATE + INTERVAL '3' MONTH AS next_quarter,
       SYSDATE + INTERVAL '7' DAY AS next_week
FROM dual;

希望本教程能帮助您掌握Oracle数据库中的时间格式调整方法。根据实际需求选择合适的格式函数和格式元素,可以灵活处理各种日期时间数据。