Oracle 23c中ROUND(DATE)缺省与显式'DAY'参数结果不一致问题问询
Oracle 23c中ROUND(date)与ROUND(date, 'DAY')的行为差异原因
你遇到的问题核心是对ROUND函数两个用法的作用对象理解有误,两者并非等价:
1. ROUND(date)(省略第二个参数)的行为
省略格式参数时,ROUND(date)是将日期时间四舍五入到最近的午夜(当天或次日的00:00:00),判断阈值是当天中午12点:
- 若时间≥12:00:00,进一位到次日午夜;
- 若时间<12:00:00,保留当天午夜。
你的示例中2024-06-26 15:02:18超过12点,因此default_result为2024-06-27 00:00:00,符合预期。
2. ROUND(date, 'DAY')的行为
显式传入'DAY'参数时,函数的作用是将日期四舍五入到最近的周起始日(周起始日由NLS_TERRITORY参数决定,默认多为周日),判断阈值是一周的中间点:
- 以周日为周起始的场景,一周的中间是周三中午12点;
- 若目标日期时间≥周三12:00:00,舍入到下一个周日;
- 若目标日期时间<周三12:00:00,舍入到上一个周日。
你的示例中2024-06-26 15:02:18是周三下午,已过周三中午,因此day_explicit会被舍入到2024-06-30(下一个周日),而非你预期的次日。
验证示例
可以通过以下SQL直观验证两者的差异:
SELECT TO_DATE('2024-06-26 11:59:59','YYYY-MM-DD HH24:MI:SS') AS original_before_midday, ROUND(TO_DATE('2024-06-26 11:59:59','YYYY-MM-DD HH24:MI:SS')) AS round_default_before, ROUND(TO_DATE('2024-06-26 11:59:59','YYYY-MM-DD HH24:MI:SS'), 'DAY') AS round_day_before, TO_DATE('2024-06-26 12:00:00','YYYY-MM-DD HH24:MI:SS') AS original_after_midday, ROUND(TO_DATE('2024-06-26 12:00:00','YYYY-MM-DD HH24:MI:SS')) AS round_default_after, ROUND(TO_DATE('2024-06-26 12:00:00','YYYY-MM-DD HH24:MI:SS'), 'DAY') AS round_day_after FROM dual;
关于周起始日的设置
周起始日由会话级参数NLS_TERRITORY控制,可通过以下SQL查看当前设置:
SELECT value FROM nls_session_parameters WHERE parameter = 'NLS_TERRITORY';
若修改该参数(如设置为'UNITED KINGDOM'),周起始日会变为周一,此时ROUND(date, 'DAY')会舍入到最近的周一。
内容的提问来源于stack exchange,提问作者drk
相关产品推荐
相关产品推荐

