You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:05:11