oracle trunc/round用法

本文介绍了SQL中的几种常用数学函数,包括四舍五入的ROUND函数、截断小数的TRUNC函数以及向上取整的CEIL函数和向下取整的FLOOR函数,并通过具体示例展示了这些函数的应用。

ROUND具有四舍五入功能,默认情况下number取0:

ROUND(XX,[number])

如:

>select ROUND(12375.989,-2) FROM DUAL;
 
ROUND(12375.989,-2)
-------------------
              12400

 

和:

ROUND(12335.989,-2)
-------------------
              12300

TRUNC不具有四舍五入功能:

TRUNC(xx,[number])

SQL> select TRUNC(123875.989,-2) FROM DUAL;
 
TRUNC(123875.989,-2)
--------------------
              123800

 

CEIL(n)函数:取大于等于数值n的最小整数

--在Oracle 9i中
SELECT mgr,mgr/100,CEIL(mgr/100) FROM scott.emp;
--结果:
       MGR    MGR/100 CEIL(MGR/100)
---------- ---------- -------------
      7902      79.02            80
      7698      76.98            77
      7698      76.98            77
      7839      78.39            79
FLOOR(n)函数:取小于等于数值n的最大整数

--在Oracle 9i中
SELECT mgr,mgr/100,FLOOR(mgr/100) FROM scott.emp;

--结果:
       MGR    MGR/100 FLOOR(MGR/100)
---------- ---------- --------------
      7902      79.02             79
      7698      76.98             76
      7698      76.98             76
      7839      78.39             78
      7698      76.98             76
      7839      78.39             78
      7839      78.39             78

<think> 嗯,用户想了解Oracle数据库中TRUNC函数的使用方法。从引用内容来看,TRUNC函数主要有数值截断和日期截断两种用途。 先看数值截断部分。引用[3]给出了很清晰的示例:直接TRUNC(123.4567)会去掉所有小数得到123;指定小数位TRUNC(123.4567,2)保留两位小数得123.45;负数参数TRUNC(123.4567,-1)会截断十位数变成120。引用[4]补充说明了负数参数是向小数点左侧截断的特性。 日期截断方面,引用[2]展示了丰富案例:TRUNC(sysdate)取当天日期;'mm'参数取当月第一天;'yy'取当年第一天;'d'参数取本周第一天。这里要注意引用[4]特别指出'iw'参数的行为取决于NLS_TERRITORY设置。引用[4]还强调截断后时分秒会被置零。 用户可能没意识到的重要细节:引用[4]提到日期截断会重置时间部分为00:00:00,这在时间敏感查询中很关键。引用[1]和[4]都指出财务计算时这个函数很实用,能避免浮点误差。 考虑到用户是查询用法,应该优先展示基础语法和典型场景。需要区分数值和日期两种模式,重点说明第二个精度参数的行为差异。财务应用场景可以强调截断比四舍五入更符合某些计算规则。 安全方面要提醒Oracle版本差异问题,比如老版本可能不支持'tz'时区截断。边界情况如截断1970年之前的日期也要注意。最后补充性能提示,因为索引在日期截断后可能失效。 </think>Oracle数据库中的`TRUNC`函数用于对**数值**或**日期**进行截断操作,主要分为两种用法--- ### 一、数值截断(针对数字类型) **语法**:`TRUNC(number [, decimal_places])` * **作用**:保留指定位数的小数(或整数位),直接丢弃多余部分,**不进行四舍五入**。 * **参数**: * `number`:待截断的数字。 * `decimal_places`(可选):指定保留的小数位数。 * 正数:保留小数点后指定位数(如 `2` 保留两位小数)。 * 负数:截断小数点左边的指定位数(如 `-1` 截断到十位)。 * 省略:默认为 `0`,截断所有小数部分,返回整数。 **示例**: ```sql SELECT TRUNC(123.4567) AS trunc_default, -- 123 TRUNC(123.4567, 2) AS trunc_2_dec, -- 123.45 TRUNC(123.4567, -1) AS trunc_10s_place, -- 120 (截断到十位) TRUNC(123.4567, -2) AS trunc_100s_place -- 100 (截断到百位) FROM dual; ``` **应用场景**: > 财务计算中精确控制小数位(如货币计算)、数据统计时统一精度、格式化显示数据[^1][^3][^4]。 --- ### 二、日期截断(针对日期类型) **语法**:`TRUNC(date [, format_model])` * **作用**:将日期截断到指定精度(如年、月、日等),**时间部分置为 `00:00:00`**。 * **参数**: * `date`:待截断的日期。 * `format_model`(可选):指定截断精度(常用值见下表)。省略时默认截断到 **天**(`DD`)。 | **格式参数** | **含义** | **示例(输入:2023-10-15 14:30:45)** | |--------------|------------------|---------------------------------------| | `YYYY` / `YY` | 截断到当年第一天 | 2023-01-01 00:00:00 | | `MM` / `MON` | 截断到当月第一天 | 2023-10-01 00:00:00 | | `DD` | 截断到当天 | 2023-10-15 00:00:00 | | `HH24` / `HH` | 截断到当前小时 | 2023-10-15 14:00:00 | | `MI` | 截断到当前分钟 | 2023-10-15 14:30:00 | | `D` / `DY` | 截断到本周第一天(周日) | 2023-10-15(假设周日) | | `IW` | 截断到本周第一天(周一) | 2023-10-09(ISO周) | | `Q` | 截断到当季第一天 | 2023-10-01(Q4) | **示例**: ```sql SELECT TRUNC(SYSDATE) AS today, -- 当前日期 00:00:00 TRUNC(SYSDATE, 'MM') AS month_start, -- 当月第一天 TRUNC(SYSDATE, 'YYYY') AS year_start, -- 当年第一天 TRUNC(SYSDATE, 'HH24') AS current_hour, -- 当前小时整点 TRUNC(SYSDATE, 'Q') AS quarter_start -- 本季度第一天 FROM dual; ``` **应用场景**: > 按日/月/年汇总数据、生成周期报表、日期范围查询(忽略时间部分)[^2][^4]。 --- ### 三、关键注意事项 1. **与`ROUND`的区别** `TRUNC`直接丢弃多余部分;`ROUND`会进行四舍五入。 *示例*: $$ \text{TRUNC}(15.79, 1) = 15.7 \quad \text{vs} \quad \text{ROUND}(15.79, 1) = 15.8 $$ 2. **时间部分归零** 日期截断后,时分秒均被设置为 `00:00:00`,需注意比较逻辑[^2][^4]。 3. **负数截断逻辑** 数值截断时,负参数向整数高位截断: $$ \text{TRUNC}(1234.56, -2) = 1200 $$ 4. **时区处理** 若日期包含时区信息(如`TIMESTAMP WITH TIME ZONE`),截断会保留原始时区[^4]。 --- ### 四、总结 | **功能** | **语法** | **核心用途** | |----------------|------------------------------|----------------------------------| | 数值截断 | `TRUNC(number [, n])` | 精确控制数字精度,避免四舍五入 | | 日期截断 | `TRUNC(date [, format])` | 按周期对齐日期,简化时间范围计算 | > 通过灵活使用参数,`TRUNC`可高效支持财务、统计、报表等场景的数据规范化需求[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值