在Oracle数据库的实际开发场景中,日期数据的存储和展示往往需要不同的格式,日期格式转换是解决这类需求的核心操作,主要通过内置的日期转换函数实现不同格式之间的转换适配。

Oracle日期格式转换的核心函数
Oracle提供了两个最基础的日期转换函数,分别对应字符串转日期、日期转字符串的需求,这两个函数覆盖了绝大多数日期格式转换场景。
1. TO_DATE函数:字符串转日期
TO_DATE函数的作用是将符合特定格式的字符串转换为Oracle的日期类型(DATE),语法格式为TO_DATE(字符串, 格式掩码),其中格式掩码需要和字符串的实际格式完全匹配,否则会抛出转换错误。
常用的日期格式掩码元素包括:
- YYYY:四位年份
- MM:两位月份(01-12)
- DD:两位日期(01-31)
- HH24:24小时制的小时(00-23)
- MI:分钟(00-59)
- SS:秒(00-59)
下面是一个将字符串转为日期的示例代码:
-- 将字符串'2024-05-20 14:30:00'转为DATE类型
SELECT TO_DATE('2024-05-20 14:30:00', 'YYYY-MM-DD HH24:MI:SS') AS convert_result
FROM DUAL;
2. TO_CHAR函数:日期转字符串
TO_CHAR函数的作用是将DATE类型的日期数据转换为指定格式的字符串,语法格式为TO_CHAR(日期, 格式掩码),可以根据需求自定义输出字符串的格式。
示例代码如下:
-- 将当前系统日期转为'年-月-日 时:分:秒'格式的字符串
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS date_str
FROM DUAL;
-- 将日期转为中文格式的字符串
SELECT TO_CHAR(TO_DATE('2024-05-20', 'YYYY-MM-DD'), 'YYYY"年"MM"月"DD"日"') AS cn_date_str
FROM DUAL;
不同场景的日期转换示例
场景1:前端传入字符串日期存入数据库
前端传入的日期字符串格式通常为'yyyy/MM/dd',需要转换为Oracle DATE类型后存入表字段,转换代码如下:
-- 插入数据时转换字符串日期
INSERT INTO user_info (user_id, register_date)
VALUES (1001, TO_DATE('2024/05/20', 'YYYY/MM/DD'));
场景2:查询时按指定格式展示日期
数据库存储的DATE类型日期默认展示格式不符合需求时,可以用TO_CHAR转换后展示:
-- 查询用户注册日期,按'MM/DD/YYYY'格式展示 SELECT user_id, TO_CHAR(register_date, 'MM/DD/YYYY') AS register_date_str FROM user_info WHERE user_id = 1001;
场景3:不同日期格式之间的转换
如果需要将一种格式的日期字符串转为另一种格式的字符串,可以先转为DATE类型,再转为目标格式的字符串:
-- 将'20-05-2024'格式的字符串转为'2024年05月20日'格式
SELECT TO_CHAR(
TO_DATE('20-05-2024', 'DD-MM-YYYY'),
'YYYY"年"MM"月"DD"日"'
) AS target_date_str
FROM DUAL;
日期转换的注意事项
在进行日期格式转换时,需要注意以下几点避免出错:
- 格式掩码的大小写敏感,比如MM表示月份,mm表示分钟,使用错误会导致转换结果不符合预期
- 字符串的实际内容和格式掩码必须完全匹配,比如字符串是'2024-5-20',格式掩码不能写'YYYY-MM-DD',因为月份和日期只有一位,需要对应使用'YYYY-M-D'
- 如果转换的字符串包含时分秒,格式掩码必须包含对应的时间元素,否则时分秒部分会被截断为0
- 处理空值或者非法日期字符串时,可以结合NVL或者CASE WHEN语句做容错处理,避免转换报错导致查询中断
下面是一个容错处理的示例代码:
-- 处理可能为空的日期字符串,为空时返回NULL
SELECT
CASE
WHEN date_str IS NOT NULL THEN TO_DATE(date_str, 'YYYY-MM-DD')
ELSE NULL
END AS convert_date
FROM (
SELECT '2024-05-20' AS date_str FROM DUAL
UNION ALL
SELECT NULL AS date_str FROM DUAL
);