TRUNC

说明

截断为指定小数位置的数字

按指定的日期格式截断日期值

语法

trunc ::=

参数

numeric_expression

精确数字或近似数字数据类型类别的表达式,将要被截断的值。

length

numeric_expression 将要截断的精度。

length 必须是 INT1 、 INT2 或 INT4 。

  • length 为正数时, numeric_expression 截断为 length 所指定的小数位数。
  • length 为负数时, numeric_expression 则按 length 所指定的在小数点的左边截断。
  • length 取值范围 [-2147483648, 2147483647]
  • length = 2147483647, 则返回 numeric_expression
  • length = -2147483648, 则返回 0
  • length > 2147483647, 则报错
  • length < -2147483648, 则报错

date

日期值,支持所有的时期格式。

Timestamp:支持所有的fmt格式;

Timestamptz:支持所有的fmt格式;

Date:支持所有的fmt格式, 时分秒都为0

Intervalytm:支持千年、世纪、年、10年、月份的截断

Intervaldts:支持天、小时、分钟、秒、毫秒、微秒的截断;

fmt

日期格式,该日期将由指定的格式所截去

fmt参数缺省时,表示对date进行按日截断,去除分时秒

支持的格式截断信息说明

描述 Fmt 备注
千年

MILLENNIUM

MILLENNIA

MILS

MIL

 
世纪

CC

SCC

C

CENT

CENTURIES

CENTURY

 
十年

DECADES

DECADE

DECS

DEC

 

SYYYY

YYYY

YEAR

SYEAR

YYY

YY

Y

YR

YRS

YEARS

 
iso 标准年

IYYY

IYY

IY

I

 
季度

Q

QUARTER

QTR

 

MONTH

MON

MM

RM

MONS

MONTHS

 
星期某一天(与该年第一天的星期数为截断星期) WW  
星期的第一天(周日为第一天)

DAY

DY

D

要DAY、D兼容oracle需要打开兼容参数 COMPATABLE_DBMS=1
星期的第一天(周1为第一天) IW  
星期某一天(与该月份第一天的星期数为截断星期) W 兼容oracle需要打开兼容参数COMPATABLE_DBMS=1

DDD

DD

J

DAY

DAYS

D

 
小时

HH

HH12

HH24

HOUR

HOURS

HRS

HR

H

 
分钟

MI

MINUTES

MINUTE

MINS

MIN

 

SECONDS

SECOND

SECS

SEC

S

 
毫秒

MSECONDS

MSECOND

MSECS

MSEC

MS

 
微秒

USECONDS

USECOND

USECS

USEC

US

 

返回值

  • TRUNC(numeric_expression, length) 返回与 numeric_expression 相同的类型。
  • TRUNC(date [, fmt ])返回与输入的时间类型相同。

注解

TRUNC 和 ROUND 的行为很象,唯一的不同在于 TRUNC 不考虑四舍五入的进位而直接截断到指定的精度。

date参数需要明确数据类型,不能只以字符串的形式输入,以字符串为参数会产生二义性, 无法判断参数类型时 timestamp 还是 timestamptz 或者是 date 等。

numeric_expression 不能以字符串的形式输入,否则会识别为日期类型,产生二义性报错。

示例

示例1: 用 TRUNC 截断浮点数到小数点后3位

--  用 TRUNC 截断浮点数到小数点后3位
SELECT TRUNC(192.30274, 3);
TRUNC(numeric)      |
--------------------
192.302             |
总数目:1

示例2: 用 TRUNC 截断浮点数到小数左边个位

--  用 TRUNC 截断浮点数到小数左边个位
SELECT TRUNC(192.30274, -1);
TRUNC(numeric)      |
--------------------
190                 |
总数目:1

示例3: 用 TRUNC 截断浮点数到最接近的整数

--  用 TRUNC 截断浮点数到最接近的整数
SELECT TRUNC(192.30274);
TRUNC(numeric)      |
--------------------
192                 |
总数目:1

示例4: 用 TRUNC 截断日期

--  用 TRUNC 截断日期
SELECT TRUNC('1987-9-29'::DATE, 'YY');
TRUNC(date)      |
-----------------
1987-01-01       |
总数目:1

SELECT TRUNC('YY', '1987-9-29'::DATE);
TRUNC(date)      |
-----------------
1987-01-01       |
总数目:1

示例5: 用 TRUNC 截断日期(fmt 缺省)

--  用 TRUNC 截断日期(fmt 缺省)
SELECT TRUNC('1987-9-29'::DATE);
TRUNC(date)      |
-----------------
1987-09-29       |
总数目:1

示例6: 用 TRUNC 截断时间戳

--  用 TRUNC 截断时间戳
SELECT TRUNC('1987-9-29'::TIMESTAMP, 'YY');
TRUNC(timestamp)      |
----------------------
1987-01-01 00:00:00   |
总数目:1

SELECT TRUNC('YY', '1987-9-29'::TIMESTAMP);
TRUNC(timestamp)      |
----------------------
1987-01-01 00:00:00   |
总数目:1

示例7: 用 TRUNC 截断时间戳(fmt 缺省)

--  用 TRUNC 截断时间戳(fmt 缺省)
SELECT TRUNC('1987-9-29 10:10:10.01'::TIMESTAMP);
TRUNC(timestamp)      |
----------------------
1987-09-29 00:00:00   |
总数目:1

示例8: 用 TRUNC 截断带时区的时间戳

--  用 TRUNC 截断带时区的时间戳
SELECT TRUNC('1987-9-29'::TIMESTAMPTZ, 'YY');
TRUNC(timestamptz)      |
------------------------
1987-01-01 00:00:00 +08:|
00                      |
总数目:1

SELECT TRUNC('YY' ,'1987-9-29'::TIMESTAMPTZ);
TRUNC(timestamptz)      |
------------------------
1987-01-01 00:00:00 +08:|
00                      |
总数目:1

示例9: 用 TRUNC 截断带时区的时间戳(fmt 缺省)

--  用 TRUNC 截断带时区的时间戳(fmt 缺省)
SELECT TRUNC('1987-9-29 10:10:10.01'::TIMESTAMPTZ);
TRUNC(timestamptz)      |
------------------------
1987-09-29 00:00:00 +08:|
00                      |
总数目:1

示例10: 用 TRUNC 截断时间间隔

--  用 TRUNC 截断 INTERVAL YEAR TO MONTH
SELECT trunc('+12-5'::INTERVAL YEAR TO MONTH, 'y');
TRUNC(INTERVALYTM)      |
------------------------
+000000012-00           |
总数目:1

SELECT trunc('y', '+12-5'::INTERVAL YEAR TO MONTH);
TRUNC(INTERVALYTM)      |
------------------------
+000000012-00           |
总数目:1


--  用 TRUNC 截断 INTERVAL DAY TO SECOND
SELECT TRUNC('15 14:13:12.11'::INTERVAL DAY TO SECOND, 'h');
TRUNC(INTERVALDTS)      |
------------------------
+000015 14:00:00        |
总数目:1

SELECT TRUNC('h', '15 14:13:12.11'::INTERVAL DAY TO SECOND);
TRUNC(INTERVALDTS)      |
------------------------
+000015 14:00:00        |
总数目:1

示例11: 用 TRUNC 截断时间间隔(fmt 缺省)

--  用 TRUNC 截断 INTERVAL YEAR TO MONTH(fmt 缺省)
SELECT trunc('+12-5'::INTERVAL YEAR TO MONTH);
TRUNC(INTERVALYTM)      |
------------------------
+000000012-05           |
总数目:1


--  用 TRUNC 截断 INTERVAL DAY TO SECOND(fmt 缺省)
SELECT TRUNC('15 14:13:12.11'::INTERVAL DAY TO SECOND);
TRUNC(INTERVALDTS)      |
------------------------
+000015 14:13:12        |
总数目:1