Oracle 日期时间函数使用总结
Oracle 数据库提供了丰富的日期时间函数,用于完成日期计算、格式转换、时区处理等常见操作,熟练掌握这些函数可以大幅提升日期相关查询的开发效率。本文将整理常用的 Oracle 日期时间函数,并结合示例说明其用法。
一、基础日期时间函数
1. SYSDATE
SYSDATE 用于返回当前数据库服务器的系统日期和时间,返回类型为 DATE,包含年、月、日、时、分、秒信息。
-- 查询当前系统日期时间 SELECT SYSDATE FROM DUAL;
2. SYSTIMESTAMP
SYSTIMESTAMP 返回当前数据库服务器的系统时间戳,包含时区信息,返回类型为 TIMESTAMP WITH TIME ZONE。
-- 查询当前系统时间戳 SELECT SYSTIMESTAMP FROM DUAL;
3. CURRENT_DATE 与 CURRENT_TIMESTAMP
CURRENT_DATE 返回当前会话时区的日期,CURRENT_TIMESTAMP 返回当前会话时区的时间戳,包含时区信息。
-- 查询当前会话时区的日期和时间戳 SELECT CURRENT_DATE, CURRENT_TIMESTAMP FROM DUAL;
二、日期运算相关函数
1. ADD_MONTHS
ADD_MONTHS(date, n) 用于在指定日期上增加 n 个月,n 可以为负数,表示减去对应月数。
-- 在当前日期上加3个月,减2个月 SELECT ADD_MONTHS(SYSDATE, 3) AS add_3_months, ADD_MONTHS(SYSDATE, -2) AS minus_2_months FROM DUAL;
2. MONTHS_BETWEEN
MONTHS_BETWEEN(date1, date2) 用于计算两个日期之间相差的月数,结果为正数表示 date1 晚于 date2,负数则相反。
-- 计算2024-01-01和2023-10-01之间相差的月数
SELECT MONTHS_BETWEEN(TO_DATE('2024-01-01', 'YYYY-MM-DD'), TO_DATE('2023-10-01', 'YYYY-MM-DD')) AS months_diff
FROM DUAL;3. NEXT_DAY
NEXT_DAY(date, char) 用于返回指定日期之后的第一个星期几对应的日期,char 可以是星期几的英文全称、缩写或者数字(1代表周日,2代表周一,以此类推)。
-- 查询当前日期之后第一个周一的日期 SELECT NEXT_DAY(SYSDATE, 'MONDAY') AS next_monday FROM DUAL; -- 使用数字表示,2代表周一 SELECT NEXT_DAY(SYSDATE, 2) AS next_monday_num FROM DUAL;
4. LAST_DAY
LAST_DAY(date) 用于返回指定日期所在月份的最后一天的日期。
-- 查询当前月份的最后一天
SELECT LAST_DAY(SYSDATE) AS last_day_of_month FROM DUAL;
-- 查询2024年2月的最后一天
SELECT LAST_DAY(TO_DATE('2024-02-01', 'YYYY-MM-DD')) AS feb_last_day FROM DUAL;三、日期截取与四舍五入函数
1. TRUNC(日期截断)
TRUNC(date, fmt) 用于按照指定格式截断日期,保留 fmt 指定的时间粒度,后面的时间部分设为最小值(如年截断则月日设为1月1日,时截断则分秒设为0)。
-- 按年截断,返回当年1月1日 SELECT TRUNC(SYSDATE, 'YEAR') AS trunc_by_year FROM DUAL; -- 按月截断,返回当月1日 SELECT TRUNC(SYSDATE, 'MONTH') AS trunc_by_month FROM DUAL; -- 按天截断,返回当天0点 SELECT TRUNC(SYSDATE, 'DD') AS trunc_by_day FROM DUAL; -- 按小时截断,返回当前小时的0分0秒 SELECT TRUNC(SYSDATE, 'HH') AS trunc_by_hour FROM DUAL;
2. ROUND(日期四舍五入)
ROUND(date, fmt) 用于按照指定格式对日期进行四舍五入,例如按月四舍五入时,如果日期超过当月15日,则返回下月1日,否则返回当月1日。
-- 按年月四舍五入,假设当前日期为2024-06-20,返回2024-07-01;如果是2024-06-10,返回2024-06-01 SELECT ROUND(SYSDATE, 'MONTH') AS round_by_month FROM DUAL; -- 按年四舍五入,超过6月则返回下一年1月1日,否则返回本年1月1日 SELECT ROUND(SYSDATE, 'YEAR') AS round_by_year FROM DUAL;
四、日期格式转换函数
1. TO_DATE
TO_DATE(char, fmt) 用于将字符串按照指定格式转换为 DATE 类型,fmt 为日期格式模型。
-- 将字符串转换为日期类型
SELECT TO_DATE('2024-05-20 14:30:25', 'YYYY-MM-DD HH24:MI:SS') AS converted_date FROM DUAL;2. TO_CHAR
TO_CHAR(date, fmt) 用于将日期类型按照指定格式转换为字符串,常用于日期的展示和格式化输出。
-- 将当前日期转换为指定格式的字符串 SELECT TO_CHAR(SYSDATE, 'YYYY年MM月DD日 HH24时MI分SS秒') AS formatted_date FROM DUAL; -- 提取年份、月份、日 SELECT TO_CHAR(SYSDATE, 'YYYY') AS year, TO_CHAR(SYSDATE, 'MM') AS month, TO_CHAR(SYSDATE, 'DD') AS day FROM DUAL;
五、时区相关函数
1. FROM_TZ
FROM_TZ(timestamp, timezone) 用于将时间戳和时区组合成 TIMESTAMP WITH TIME ZONE 类型。
-- 构造带时区的时间戳 SELECT FROM_TZ(TIMESTAMP '2024-05-20 10:00:00', 'Asia/Shanghai') AS tz_timestamp FROM DUAL;
2. NEW_TIME
NEW_TIME(date, timezone1, timezone2) 用于将 date 从 timezone1 时区转换为 timezone2 时区的时间,返回 DATE 类型。
-- 将当前时间从上海时区转换为东京时区 SELECT NEW_TIME(SYSDATE, 'AST', 'JST') AS tokyo_time FROM DUAL;
六、常用日期计算场景示例
以下是几个实际开发中常见的日期计算场景示例:
计算两个日期之间相差的天数:直接两个日期相减即可,Oracle 中日期相减返回相差的天数(可带小数,表示不足一天的小时分秒)
计算指定日期所在年份的天数:使用 ADD_MONTHS 计算下一年1月1日,再减去当前年份1月1日
判断某一年是否为闰年:如果2月最后一天是29日则为闰年
-- 计算2024-01-01到2024-12-31相差的天数
SELECT TO_DATE('2024-12-31', 'YYYY-MM-DD') - TO_DATE('2024-01-01', 'YYYY-MM-DD') AS days_diff FROM DUAL;
-- 计算2024年全年的天数
SELECT
ADD_MONTHS(TRUNC(TO_DATE('2024-01-01', 'YYYY-MM-DD'), 'YEAR'), 12)
- TRUNC(TO_DATE('2024-01-01', 'YYYY-MM-DD'), 'YEAR') AS year_days
FROM DUAL;
-- 判断2024年是否为闰年
SELECT
CASE
WHEN TO_CHAR(LAST_DAY(TO_DATE('2024-02-01', 'YYYY-MM-DD')), 'DD') = '29' THEN '是闰年'
ELSE '不是闰年'
END AS is_leap_year
FROM DUAL;七、注意事项
使用 Oracle 日期时间函数时需要注意以下几点:
DATE 类型默认只显示日期部分,时间部分如果需要展示需要使用 TO_CHAR 转换
进行日期运算时,要确保参与运算的字段或值为日期时间类型,避免隐式转换导致的错误
时区相关函数使用时要注意数据库和会话的时区设置,避免时间偏差
格式模型中的字母大小写敏感,例如 HH24 表示24小时制,HH 表示12小时制,MI 表示分钟,MM 表示月份,容易混淆的要注意区分