ROUND(date_value, 'DAY')
舍入到最接近的一周开始(由NLS_TERRITORY
会话/数据库参数定义).
ROUND(date_value, 'DD')
是四舍五入到最接近的日子.
这一点记录在ROUND and TRUNC Date Functions documentation:
Format Model |
Rounding or Truncating Unit |
DDD DD J |
Day |
DAY DY D |
Starting day of the week |
例如:
如果您有样例数据:
CREATE TABLE table_name (dt) AS
SELECT TRUNC(DATE '2024-06-26', 'IW') + LEVEL - 1 + INTERVAL '15:02:18' HOUR TO SECOND
FROM DUAL
CONNECT BY LEVEL <= 7;
并且您可以使用:
ALTER SESSION SET NLS_TERRITORY = 'Germany'
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS (DY)';
SELECT dt,
ROUND(dt) AS default_result,
ROUND(dt, 'DAY') AS day_explicit,
ROUND(dt, 'DD') AS dd_explicit
FROM table_name;
则输出为:
DT |
DEFAULT_RESULT |
DAY_EXPLICIT |
DD_EXPLICIT |
2024-06-24 15:02:18 (MON) |
2024-06-25 00:00:00 (TUE) |
2024-06-24 00:00:00 (MON) |
2024-06-25 00:00:00 (TUE) |
2024-06-25 15:02:18 (TUE) |
2024-06-26 00:00:00 (WED) |
2024-06-24 00:00:00 (MON) |
2024-06-26 00:00:00 (WED) |
2024-06-26 15:02:18 (WED) |
2024-06-27 00:00:00 (THU) |
2024-06-24 00:00:00 (MON) |
2024-06-27 00:00:00 (THU) |
2024-06-27 15:02:18 (THU) |
2024-06-28 00:00:00 (FRI) |
2024-07-01 00:00:00 (MON) |
2024-06-28 00:00:00 (FRI) |
2024-06-28 15:02:18 (FRI) |
2024-06-29 00:00:00 (SAT) |
2024-07-01 00:00:00 (MON) |
2024-06-29 00:00:00 (SAT) |
2024-06-29 15:02:18 (SAT) |
2024-06-30 00:00:00 (SUN) |
2024-07-01 00:00:00 (MON) |
2024-06-30 00:00:00 (SUN) |
2024-06-30 15:02:18 (SUN) |
2024-07-01 00:00:00 (MON) |
2024-07-01 00:00:00 (MON) |
2024-07-01 00:00:00 (MON) |
因为在欧洲大部分地区,一周的开始是星期一.
如果您在不同地区使用相同的查询:
ALTER SESSION SET NLS_TERRITORY = 'America'
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS (DY)';
SELECT dt,
ROUND(dt) AS default_result,
ROUND(dt, 'DAY') AS day_explicit,
ROUND(dt, 'DD') AS dd_explicit
FROM table_name;
则输出为:
DT |
DEFAULT_RESULT |
DAY_EXPLICIT |
DD_EXPLICIT |
2024-06-24 15:02:18 (MON) |
2024-06-25 00:00:00 (TUE) |
2024-06-23 00:00:00 (SUN) |
2024-06-25 00:00:00 (TUE) |
2024-06-25 15:02:18 (TUE) |
2024-06-26 00:00:00 (WED) |
2024-06-23 00:00:00 (SUN) |
2024-06-26 00:00:00 (WED) |
2024-06-26 15:02:18 (WED) |
2024-06-27 00:00:00 (THU) |
2024-06-30 00:00:00 (SUN) |
2024-06-27 00:00:00 (THU) |
2024-06-27 15:02:18 (THU) |
2024-06-28 00:00:00 (FRI) |
2024-06-30 00:00:00 (SUN) |
2024-06-28 00:00:00 (FRI) |
2024-06-28 15:02:18 (FRI) |
2024-06-29 00:00:00 (SAT) |
2024-06-30 00:00:00 (SUN) |
2024-06-29 00:00:00 (SAT) |
2024-06-29 15:02:18 (SAT) |
2024-06-30 00:00:00 (SUN) |
2024-06-30 00:00:00 (SUN) |
2024-06-30 00:00:00 (SUN) |
2024-06-30 15:02:18 (SUN) |
2024-07-01 00:00:00 (MON) |
2024-06-30 00:00:00 (SUN) |
2024-07-01 00:00:00 (MON) |
因为甲骨文认为美国一周的开始是周日.
如果您这样做了:
ALTER SESSION SET NLS_TERRITORY = 'Bangladesh'
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS (DY)';
SELECT dt,
ROUND(dt) AS default_result,
ROUND(dt, 'DAY') AS day_explicit,
ROUND(dt, 'DD') AS dd_explicit
FROM table_name;
则输出为:
DT |
DEFAULT_RESULT |
DAY_EXPLICIT |
DD_EXPLICIT |
2024-06-24 15:02:18 (MON) |
2024-06-25 00:00:00 (TUE) |
2024-06-28 00:00:00 (FRI) |
2024-06-25 00:00:00 (TUE) |
2024-06-25 15:02:18 (TUE) |
2024-06-26 00:00:00 (WED) |
2024-06-28 00:00:00 (FRI) |
2024-06-26 00:00:00 (WED) |
2024-06-26 15:02:18 (WED) |
2024-06-27 00:00:00 (THU) |
2024-06-28 00:00:00 (FRI) |
2024-06-27 00:00:00 (THU) |
2024-06-27 15:02:18 (THU) |
2024-06-28 00:00:00 (FRI) |
2024-06-28 00:00:00 (FRI) |
2024-06-28 00:00:00 (FRI) |
2024-06-28 15:02:18 (FRI) |
2024-06-29 00:00:00 (SAT) |
2024-06-28 00:00:00 (FRI) |
2024-06-29 00:00:00 (SAT) |
2024-06-29 15:02:18 (SAT) |
2024-06-30 00:00:00 (SUN) |
2024-06-28 00:00:00 (FRI) |
2024-06-30 00:00:00 (SUN) |
2024-06-30 15:02:18 (SUN) |
2024-07-01 00:00:00 (MON) |
2024-06-28 00:00:00 (FRI) |
2024-07-01 00:00:00 (MON) |
因为孟加拉的这周是星期五开始.
同样,如果你把NLS_TERRITORY
设定为中东的一个国家,你会发现这一周大多是从周六开始的.
Note: If you want to always round to Monday then use the 100 format model for the start of the ISO week (as defined by ISO 8601).
fiddle个