TO_CHAR

说明

转换成CHAR类型。

语法

to_char ::=

参数

varchar_expression

插入数值类型的字符串。

numeric_expression

int_expression

bigint_expression

float_expression

double_expression

timestamp_expression

timestamptz_expression

interval_expression

date_expression

clob_expression

给定的不同类型的表达式

text_expression

给定的格式表达式。

  • 对于数值型的转换,每一位数字位都要对应一个0,如里不对应着0,则不能保证其转换的合理性。
  • 对于TIMESTAMP类型的转换,其格式应与timstamp类型数据的书写形式一样。 若年月日时分秒之间的间隔用其它的字符来代替,则结果中的也一样发生了相应的改变。 若间隔符之外的其它格式发生了变化,则会出错。
  • DATE类型、TIMESTAMP类型和TIMESTAMP WITH TIME ZONE类型在没有指定格式表达式的情况下,类型转换需要分别参照DATEFORMAT参数、TIMESTAMPFORMAT参数和TIMESTAMPTZFORMAT参数。 如果DATEFORMAT参数、TIMESTAMPFORMAT参数和TIMESTAMPTZFORMAT参数没有指定,则会参照DATEORDER和DATESTYLE进行匹配,如果匹配失败则报错。

数字格式元素:

例子 描述 举例
9,999 返回指定位置的逗号(逗号元素不能以数字格式模型开头) SELECT TO_CHAR(1000,'9,999') FROM DUAL;
99.99 返回一个小数点,它是指定位置的周期(数字模式中只能指定一个句点) SELECT TO_CHAR(+0.1,'99.99') FROM DUAL;
$9999 返回带有前导美元符号的值 SELECT TO_CHAR(1000,'$9999') FROM DUAL;
0999 返回前导零(默认尾随零) SELECT TO_CHAR(123,'0999') FROM DUAL;
RN 以罗马数字大写形式返回值(值可以是1到3999之间的整数) SELECT TO_CHAR(1235,'RN') FROM DUAL;
9999S 返回带有尾随减号(-/+)的负值(s 格式元素只能出现在数字 格式模型的第一个或最后一个位置) SELECT TO_CHAR(-1234,'9999S') FROM DUAL;
XXXX 返回指定位数的十六进制值(如果指定的数字不是整数,则其舍入为整数) SELECT TO_CHAR(10.00,'XXXX') FROM DUAL;

时间格式元素:

例子 描述 举例
AD|BC 有或无AD显示(神通目前没有实现公元前(BC)的表示) SELECT TO_CHAR(SYSTIMESTAMP, 'ADYYYY') from DUAL;
AM|PM 带或不带AM显示 SELECT TO_CHAR(SYSTIMESTAMP, 'AMYYYY') from DUAL;
CC 世纪,(2099和2001报表21,2000报表20) SELECT TO_CHAR(SYSTIMESTAMP, 'CC') from DUAL;
D 星期(1-7),注意:每星期的第1天是”星期日“ SELECT TO_CHAR(SYSTIMESTAMP, 'D') from DUAL;
DAY 日期 SELECT TO_CHAR(SYSTIMESTAMP, 'DAY') from DUAL;
DD 月日(1-31) SELECT TO_CHAR(SYSTIMESTAMP, 'DD') from DUAL;
DDD 年日(1-366) SELECT TO_CHAR(SYSTIMESTAMP, 'DDD') from DUAL;
DY 星期的缩写 SELECT TO_CHAR(SYSTIMESTAMP, 'DY') from DUAL;
FF 小数秒 SELECT TO_CHAR(SYSTIMESTAMP, 'SS.FF') from DUAL;
HH 每天(1-12)小时 SELECT TO_CHAR(SYSTIMESTAMP, 'HH') from DUAL;
HH24 每天(0-23)小时 SELECT TO_CHAR(SYSTIMESTAMP, 'HH24') from DUAL;
IW 国际编码标准所定义的年历周(1-52或1-53) SELECT TO_CHAR(SYSTIMESTAMP, 'IW') from DUAL;
IYYY|IYY|IY|I 国际编码标准所定义的年份的4,3,2,1位数字 SELECT TO_CHAR(SYSTIMESTAMP, 'IYYY') from DUAL;
J 儒略日:公元前4712年1月1日以来的天数,用j指定的天数必须是整数 SELECT TO_CHAR(SYSTIMESTAMP, 'J') from DUAL;
MI 一分钟(0-59) SELECT TO_CHAR(SYSTIMESTAMP, 'MI') from DUAL;
MM 月份(01-12) SELECT TO_CHAR(SYSTIMESTAMP, 'MM') from DUAL;
MON 月份的缩写 SELECT TO_CHAR(SYSTIMESTAMP, 'MON') from DUAL;
MONTH 月份的名称 SELECT TO_CHAR(SYSTIMESTAMP, 'MONTH') from DUAL;
Q 一年的季度(1-4) SELECT TO_CHAR(SYSTIMESTAMP, 'Q') from DUAL;
RM 罗马数字月(I-XII) SELECT TO_CHAR(SYSTIMESTAMP, 'RM') from DUAL;
SS 秒(0-59) SELECT TO_CHAR(SYSTIMESTAMP, 'SS') from DUAL;
SSSSS 0点过后几秒(0-86399) SELECT TO_CHAR(SYSTIMESTAMP, 'SSSSS') from DUAL;
WW 一年中的第几周(1-53) SELECT TO_CHAR(SYSTIMESTAMP, 'WW') from DUAL;
Y,YYY 年,在这个位置加逗号 SELECT TO_CHAR(SYSTIMESTAMP, 'Y,YYY') from DUAL;
YEAR SELECT TO_CHAR(SYSTIMESTAMP, 'YEAR') from DUAL;
YYYY|YYY|YY|Y 年后面的位数3位,2位,1位数字 SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY') from DUAL;

返回值

text_expression 相同的类型

注解

ORACLE中关键字'SSSS'返回的是两次时间的秒数关键字'SSSSS'返回午夜后秒数

OSCAR中关键字'SSSS'和'SSSSS'都返回午夜后秒数

示例

示例1: 使用 TO_CHAR 转换

--  使用 TO_CHAR 转换
SELECT TO_CHAR('2000-02-06 11:11:11'::TIMESTAMP, 'yyyy-mm-dd hh:mi:ss');
TO_CHAR(text)      |
-------------------
2000-02-06 11:11:11|
总数目:1


SELECT TO_CHAR(123.12, '000.00');
TO_CHAR(text)      |
-------------------
 123.12            |
总数目:1

示例2: DATE类型使用 TO_CHAR 转换(不指定格式表达式)

set DATEFORMAT='YYYYMMDD HHMISS';

select to_char(to_date('20121212'));
TO_CHAR(text)      |
-------------------
20121212 120000    |
总数目:1

select to_char(to_date('20121212 121212'));
TO_CHAR(text)      |
-------------------
20121212 121212    |
总数目:1

select to_char(to_date('20121212 121212.123456'));
TO_CHAR(text)      |
-------------------
20121212 121212    |
总数目:1

示例3: TIMESTAMP类型使用 TO_CHAR 转换(不指定格式表达式)

set TIMESTAMPFORMAT='YYYY-MM-DD HH24:MI:SS.FF';


select to_char(to_timestamp('2012-12-12'));
TO_CHAR(text)      |
-------------------
2012-12-12 00:00:00|
.000000            |
总数目:1

select to_char(to_timestamp('2012-12-12 12:12:12'));
TO_CHAR(text)      |
-------------------
2012-12-12 12:12:12|
.000000            |
总数目:1

select to_char(to_timestamp('2012-12-12 12:12:12.123456'));
TO_CHAR(text)      |
-------------------
2012-12-12 12:12:12|
.123456            |
总数目:1

示例4: TIMESTAMP WITH TIME ZONE类型使用 TO_CHAR 转换(不指定格式表达式)

set TIMESTAMPTZFORMAT='';


select to_char(to_timestamp_tz('2012-12-12 12:12:12.123456 +9:00','YYYY-MM-DD HH24:MI:SS.FF TZ'));
TO_CHAR(text)      |
-------------------
2012-12-12 11:12:12|
.123456 +08:00     |
总数目:1


select to_char(to_timestamp_tz('2012-12-12 12:12:12.123456 +9:00'));
TO_CHAR(text)      |
-------------------
2012-12-12 11:12:12|
.123456 +08:00     |
总数目:1

示例5: varchar类型使用 TO_CHAR 转换(指定格式转换成16进制)

select to_char('10', 'XXXX');
TO_CHAR(text)      |
-------------------
    A              |
总数目:1


select to_char('12.99', '99.99');
TO_CHAR(text)      |
-------------------
 12.99             |
总数目:1

示例6: interval类型使用 TO_CHAR 转换(指定格式)

select to_char(interval '2019-6' year(4) to month,'YEAR');
TO_CHAR(text)      |
-------------------
2019               |
总数目:1

select to_char(interval '2019-6' year(4) to month,'YYYY:MM');   
TO_CHAR(text)      |
-------------------
2019:06            |
总数目:1



select to_char(interval '200' day(4));  
TO_CHAR(text)      |
-------------------
+000200 00:00:00   |
总数目:1

select to_char(interval '200' hour(4),'HH:MI'); 
TO_CHAR(text)      |
-------------------
08:00              |
总数目:1


select to_char(interval '10' minute(2));  
TO_CHAR(text)      |
-------------------
+000000 00:10:00   |
总数目:1

select to_char(interval '10' minute(2),'MI.FF'); 
TO_CHAR(text)      |
-------------------
10.000000          |
总数目:1



select to_char(interval '6 5:12:10.222' day(2) to second(4));  
TO_CHAR(text)      |
-------------------
+000006 05:12:10.22|
2                  |
总数目:1

select to_char(interval '6 5:12:10.222' day(2) to second(4),'DD:HH:MI.FF');
TO_CHAR(text)      |
-------------------
06:05:12.222000    |
总数目:1