#TRUNC
TRUNC函数对expr的值按指定格式截断一个日期值,或按指定位数截断一个数值,返回一个DATE类型的日期值或一个NUMBER类型的数值。
当用于截断日期值时,expr的值必须为DATE、TIMESTAMP类型;当用于截断数值时,expr的值必须为数值型或可以转换为NUMBER类型的其他类型(转换失败返回Invalid number错误)。
对于其他类型,函数返回类型不支持。
当expr的值为NULL时,函数返回NULL。
fmt
指定日期值的截断格式,规则如下:
类型 | 有效格式 | 返回值 | 备注 |
---|---|---|---|
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 |
当不指定fmt时,默认为'DD'。
n
指定数值的截断位数,规则如下:
n值 | 作用 | 示例 |
---|---|---|
0 | 截断小数部分 | trunc(123.456, 0) -> 123 |
> 0 且未超出number_expr小数位数 | 截断该小数位数往后的部分 | trunc(123.456, 2) -> 123.45 |
> 0 且超出number_expr小数位数 | 原数据返回 | trunc(123.456, 5) -> 123.456 |
120; trunc(123.456, -2) -> 100 | ||
0 | ||
小数 | 正数向下取整,负数向上取整 | trunc(123.456, 1.6) = trunc(123.456, 1); trunc(123.456, -1.2) = trunc(123.456, -1) |
null | 返回 null |
当不指定n时,表示不截断,返回原数据。
示例
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