#TRUNC
TRUNC函数对expr的值按指定格式截断一个日期值,或按指定位数截断一个数值,返回一个DATE类型的日期值或一个NUMBER类型的数值。
expr
通用表达式,其值的数据类型要求如下:
当用于截断日期值时,expr的值必须为DATE、TIMESTAMP、时区类型。
当用于截断数值时,expr的值必须为数值型或可以转换为NUMBER类型的其他类型(转换失败返回Invalid number错误)。
当expr的值为NULL时,函数返回NULL。
fmt
指定日期值的截断格式,若不指定fmt则默认为'DD'。
具体的规则如下:
| 类型 | 有效格式 | 返回值 | 备注 |
|---|---|---|---|
| Century | CC, SCC | 返回当世纪第一天 | 21世纪第一年为2001年 |
| Year | SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y | 返回当年第一天 | |
| ISO Year | IYYY, IY, I | 将每年1月4日所处的周作为当年的第一周,返回该周的第一天 | ISO当年第一天可能是公历前一年12月末 |
| Quarter | Q | 返回当季度第一天 | |
| Month | MONTH, MON, MM, RM | 返回当月第一天 | |
| Week | WW | 每年的1月1日作为当年的第一周的第一天,返回当周第一天 | 星期一到星期日都有可能 |
| IW | IW | 星期一为每周的第一天,返回当周第一天 | |
| W | W | 每月1日作为本月第一周的第一天,返回当周第一天 | |
| Day | DDD, DD, J | 返回当前日期 | |
| Start day of the week | DAY, DY, D | 星期日为每周的第一天,返回当周第一天 | |
| Hour | HH, HH12, HH24 | 返回本小时的开始时间 | |
| Minute | MI | 返回本分钟的开始时间 | |
| null | null | null |
n
指定数值的截断位数,若不指定n则表示不截断,直接返回原数据。
具体的截断规则如下:
| n值 | 函数表现 | 示例 |
|---|---|---|
| n为小数 | 以n的整数部分作为位数进行数值截断 | TRUNC(123.456, 1.6) = TRUNC(123.456, 1) TRUNC(123.456, -1.2) = TRUNC(123.456, -1) |
| n = 0 | 截断小数部分 | TRUNC(123.456, 0) = 123 |
| n > 0 且未超出number_expr小数位数 | 截断该小数位数往后的部分 | TRUNC(123.456, 2) = 123.45 |
| n > 0 且超出number_expr小数位数 | 原数据返回 | TRUNC(123.456, 5) = 123.456 |
| n < 0 且未超出number_expr整数部分位数 | 截断小数部分,并将整数部分从右至左的|n|位数置为0 | TRUNC(123.456, -1) = 120 TRUNC(123.456, -2) = 100 |
| n < 0 且超出number_expr整数部分位数 | 返回0 | TRUNC(123.456, -5) = 0 |
| n为NULL | 返回NULL |
示例
SELECT TRUNC(SYSDATE-10000,'CC') res FROM DUAL;
RES
--------------------------------
1901-01-01 00:00:00
SET NUMWIDTH 30;
SELECT TRUNC('234.33333343',0) "n0",
TRUNC('234.33333343',3) "n3",
TRUNC('234.33333343',30) "n30",
TRUNC('234.33333343',-2) "n-2",
TRUNC('234.33333343',-20) "n-20",
TRUNC('234.33333343',2.98) "n2.98",
TRUNC('234.33333343',-2.98) "n-2.98"
FROM DUAL;
n0 n3 n30 n-2 n-20 n2.98 n-2.98
----- --------- ---------------- -------- --------- ------------ ----------
234 234.333 234.33333343 200 0 234.33 200

