格式化函数是一个强大的工具集,可以将各种数据类型 (DATE/TIME, INTEGER, FLOATING POINT) 转换为格式化的字符串,以及将格式化的字符串转换为特定数据类型。
格式化函数
- 1: TO_BITSTRING
- 2: TO_CHAR
- 3: TO_DATE
- 4: TO_HEX
- 5: TO_TIMESTAMP
- 6: TO_TIMESTAMP_TZ
- 7: TO_NUMBER
- 8: 用于日期/时间格式化的模板模式
- 9: 用于数字格式化的模板模式
1 - TO_BITSTRING
返回 VARCHAR,表示位字符串格式的给定 VARBINARY 值。此函数是
BITSTRING_TO_BINARY
的反函数。
行为类型
不可变语法
TO_BITSTRING ( expression )
参数
- 表达式
- 要处理的 VARCHAR 字符串。
示例
=> SELECT TO_BITSTRING('ab'::BINARY(2));
to_bitstring
------------------
0110000101100010
(1 row)
=> SELECT TO_BITSTRING(HEX_TO_BINARY('0x10'));
to_bitstring
--------------
00010000
(1 row)
=> SELECT TO_BITSTRING(HEX_TO_BINARY('0xF0'));
to_bitstring
--------------
11110000
(1 row)
另请参阅
BITCOUNT2 - TO_CHAR
将日期/时间和数字值转换成文本字符串。
行为类型
稳定语法
TO_CHAR ( expression [, pattern ] )
参数
- 表达式
- 指定要转换的值,为以下数据类型之一:
存在以下限制:
-
TO_CHAR 不支持二进制数据类型 BINARY 和 VARBINARY
-
TO_CHAR 不支持将 V 与小数点结合使用,例如,
99.9V99
-
- 模式
- 指定输出模式字符串的 CHAR 或 VARCHAR。请参阅用于日期/时间格式化的模板模式。
注意
-
Vertica 使用前置空格填充 TO_CHAR 输出,因此正值和负值具有相同的长度。要抑制填充,请使用 FM 前缀。
-
如果您将 TIME 显式转换为 TIMESTAMP 并将 TIMETZ 转换为 TIMESTAMPTZ,则 TO_CHAR 接受 TIME 和 TIMETZ 数据类型作为输入。
=> SELECT TO_CHAR(TIME '14:34:06.4','HH12:MI am'), TO_CHAR(TIMETZ '14:34:06.4+6','HH12:MI am'); TO_CHAR | TO_CHAR ----------+---------- 02:34 pm | 04:34 am (1 row)
-
您可以从 TIMETZ 提取时区小时:
=> SELECT EXTRACT(timezone_hour FROM TIMETZ '10:30+13:30'); date_part ----------- 13 (1 row)
-
普通字面量允许用于 TO_CHAR 模板,并且将当做字面量输出。您可以将子字符串放入双引号中,以强制它转换为字面量,即使包含模式关键词。在以下示例中,
YYYY
被替换为年份数据,但Year
中的 Y 不是:=> SELECT to_char(CURRENT_TIMESTAMP, '"Hello Year " YYYY'); to_char ------------------ Hello Year 2021 (1 row)
-
如果规定 INTERVAL 类型,TO_CHAR 以
HH
和HH12
作为一天的小时数,而HH24
可输出超过一天的小时数,例如>24
。 -
要在输出中包含双引号 (
"
) 字符,请在其前面加上双反斜杠 (\\
)。这样做很有必要,因为反斜杠在字符串常数中已经具有特殊含义。例如:'\\"YYYY Month\\"'
-
四舍五入时,如果数字正好是两者的中间值,舍入表示形式的最后一位数应选择偶数。
示例
另请参阅
DATE_PART3 - TO_DATE
转换字符串值为 DATE 类型。
行为类型
稳定语法
TO_DATE ( expression , pattern )
参数
- 表达式
- 指定要转换的字符串值,
CHAR
或VARCHAR
。 - 模式
- 指定输出模式字符串的
CHAR
或VARCHAR
。请参阅:
输入值注意事项
TO_DATE
需要 CHAR
或 VARCHAR
表达式。对于其他输入类型,请先使用
TO_CHAR
来执行显式强制转换为 CHAR
或 VARCHAR
,才能使用此函数。
注意
- 要在输出中使用双引号字符,请在它前面加上双反斜杠。这样做很有必要,因为反斜杠在字符串常数中已经具有特殊含义。例如:
'\\\"YYYY Month\\\"'
-
TO_TIMESTAMP
如果不使用 FX 选项,则、TO_TIMESTAMP_TZ
和TO_DATE
会跳过输入字符串中的多个空格。必须将 FX 指定为模板中的第一项。例如:-
TO_TIMESTAMP('2000 JUN', 'YYYY MON')
是正确的。 -
TO_TIMESTAMP('2000 JUN', 'FXYYYY MON')
返回错误,因为TO_TIMESTAMP
仅接受一个空格。
-
-
如果使用多于四个数字的年份,则从字符串到
TIMESTAMP
或DATE
的YYYY
转换存在限制。在YYYY
之后必须使用非数字字符或模板,否则会始终将年份解释成四个数字。例如,给定以下实参,TO_DATE
将五位数年份 20000 解释为四位数年份:=> SELECT TO_DATE('200001131','YYYYMMDD'); TO_DATE ------------ 2000-01-13 (1 row)
应在年份后使用非数字分隔符。例如:
=> SELECT TO_DATE('20000-1131', 'YYYY-MMDD'); TO_DATE ------------- 20000-12-01 (1 row)
-
在从字符串到
TIMESTAMP
或DATE
的转换中,如果存在 YYY、YYYY 或 Y,YYY 字段,则会忽略 CC 字段。如果将 CC 与 YY 或 Y 一起使用,则将按 (CC–1)*100+YY 计算年份。
示例
=> SELECT TO_DATE('13 Feb 2000', 'DD Mon YYYY');
to_date
------------
2000-02-13
(1 row)
另请参阅
日期/时间函数4 - TO_HEX
返回 VARCHAR 或 VARBINARY,表示等同于数值的十六进制值。此函数是 HEX_TO_BINARY 的反转函数。
行为类型
不可变语法
TO_HEX ( number )
参数
示例
=> SELECT TO_HEX(123456789);
TO_HEX
---------
75bcd15
(1 row)
对于 VARBINARY 输入,返回值没有 0x
前缀。例如:
=> SELECT TO_HEX('ab'::binary(2));
TO_HEX
--------
6162
(1 row)
5 - TO_TIMESTAMP
将字符串值或 UNIX/POSIX 时期值转换为 TIMESTAMP
类型。
行为类型
稳定语法
TO_TIMESTAMP ( { expression, pattern } | unix‑epoch )
参数
- 表达式
- 指定要转换的字符串值,类型为 CHAR 或 VARCHAR。
- 模式
- 指定输出模式字符串的 CHAR 或 VARCHAR。请参阅:
- unix‑epoch
- DOUBLE PRECISION 值,指定自 1970 年 1 月 1 日午夜 (UTC) 以来经过的秒数,不包括闰秒。INTEGER 值被隐式转换为 DOUBLE PRECISION。
注意
-
在从字符串到
TIMESTAMP
的转换中,毫秒 (MS) 和微秒 (US) 值用作秒小数点后面的部分。例如TO_TIMESTAMP('12:3', 'SS:MS')
不是指 3 毫秒,而是指 300 毫秒,因为转换将其算作 12 + 0.3 秒。这意味着,对于SS:MS
格式而言,输入值12:3
、12:30
和12:300
指定的是相同的毫秒数。要得到 3 毫秒,请使用12:003
,转换将其算作12 + 0.003 = 12.003
秒。下面是一个更为复杂的示例:
TO_TIMESTAMP('15:12:02.020.001230', 'HH:MI:SS.MS.US')
表示 15 小时 12 分钟零 2 秒 + 20 毫秒 + 1230 微秒 = 2.021230 秒。 -
要在输出中使用双引号字符,请在它前面加上双反斜杠。这样做很有必要,因为反斜杠在字符串常数中已经具有特殊含义。例如:
'\\\"YYYY Month\\\"'
-
TO_TIMESTAMP
如果不使用 FX 选项,则、TO_TIMESTAMP_TZ
和TO_DATE
会跳过输入字符串中的多个空格。必须将 FX 指定为模板中的第一项。例如:-
TO_TIMESTAMP('2000 JUN', 'YYYY MON')
是正确的。 -
TO_TIMESTAMP('2000 JUN', 'FXYYYY MON')
返回错误,因为TO_TIMESTAMP
仅接受一个空格。
-
-
如果使用多于四个数字的年份,则从字符串到
TIMESTAMP
或DATE
的YYYY
转换存在限制。在YYYY
之后必须使用非数字字符或模板,否则会始终将年份解释成四个数字。例如,给定以下实参,TO_DATE
将五位数年份 20000 解释为四位数年份:=> SELECT TO_DATE('200001131','YYYYMMDD'); TO_DATE ------------ 2000-01-13 (1 row)
应在年份后使用非数字分隔符。例如:
=> SELECT TO_DATE('20000-1131', 'YYYY-MMDD'); TO_DATE ------------- 20000-12-01 (1 row)
-
在从字符串到
TIMESTAMP
或DATE
的转换中,如果存在 YYY、YYYY 或 Y,YYY 字段,则会忽略 CC 字段。如果将 CC 与 YY 或 Y 一起使用,则将按 (CC–1)*100+YY 计算年份。
示例
=> SELECT TO_TIMESTAMP('13 Feb 2009', 'DD Mon YYYY');
TO_TIMESTAMP
---------------------
1200-02-13 00:00:00
(1 row)
=> SELECT TO_TIMESTAMP(200120400);
TO_TIMESTAMP
---------------------
1976-05-05 01:00:00
(1 row)
另请参阅
日期/时间函数6 - TO_TIMESTAMP_TZ
将字符串值或 UNIX/POSIX 时期值转换为 TIMESTAMP WITH TIME ZONE
类型。
行为类型
语法
TO_TIMESTAMP_TZ ( { expression, pattern } | unix‑epoch )
参数
- 表达式
- 指定要转换的字符串值,类型为 CHAR 或 VARCHAR。
- 模式
- 指定输出模式字符串的 CHAR 或 VARCHAR。请参阅:
- unix‑epoch
- DOUBLE PRECISION 值,指定自 1970 年 1 月 1 日午夜 (UTC) 以来经过的秒数,不包括闰秒。INTEGER 值被隐式转换为 DOUBLE PRECISION。
注意
-
在从字符串到
TIMESTAMP
的转换中,毫秒 (MS) 和微秒 (US) 值用作秒小数点后面的部分。例如TO_TIMESTAMP('12:3', 'SS:MS')
不是指 3 毫秒,而是指 300 毫秒,因为转换将其算作 12 + 0.3 秒。这意味着,对于SS:MS
格式而言,输入值12:3
、12:30
和12:300
指定的是相同的毫秒数。要得到 3 毫秒,请使用12:003
,转换将其算作12 + 0.003 = 12.003
秒。下面是一个更为复杂的示例:
TO_TIMESTAMP('15:12:02.020.001230', 'HH:MI:SS.MS.US')
表示 15 小时 12 分钟零 2 秒 + 20 毫秒 + 1230 微秒 = 2.021230 秒。 -
要在输出中使用双引号字符,请在它前面加上双反斜杠。这样做很有必要,因为反斜杠在字符串常数中已经具有特殊含义。例如:
'\\\"YYYY Month\\\"'
-
TO_TIMESTAMP
如果不使用 FX 选项,则、TO_TIMESTAMP_TZ
和TO_DATE
会跳过输入字符串中的多个空格。必须将 FX 指定为模板中的第一项。例如:-
TO_TIMESTAMP('2000 JUN', 'YYYY MON')
是正确的。 -
TO_TIMESTAMP('2000 JUN', 'FXYYYY MON')
返回错误,因为TO_TIMESTAMP
仅接受一个空格。
-
-
如果使用多于四个数字的年份,则从字符串到
TIMESTAMP
或DATE
的YYYY
转换存在限制。在YYYY
之后必须使用非数字字符或模板,否则会始终将年份解释成四个数字。例如,给定以下实参,TO_DATE
将五位数年份 20000 解释为四位数年份:=> SELECT TO_DATE('200001131','YYYYMMDD'); TO_DATE ------------ 2000-01-13 (1 row)
应在年份后使用非数字分隔符。例如:
=> SELECT TO_DATE('20000-1131', 'YYYY-MMDD'); TO_DATE ------------- 20000-12-01 (1 row)
-
在从字符串到
TIMESTAMP
或DATE
的转换中,如果存在 YYY、YYYY 或 Y,YYY 字段,则会忽略 CC 字段。如果将 CC 与 YY 或 Y 一起使用,则将按 (CC–1)*100+YY 计算年份。
示例
=> SELECT TO_TIMESTAMP_TZ('13 Feb 2009', 'DD Mon YYY');
TO_TIMESTAMP_TZ
------------------------
1200-02-13 00:00:00-05
(1 row)
=> SELECT TO_TIMESTAMP_TZ(200120400);
TO_TIMESTAMP_TZ
------------------------
1976-05-05 01:00:00-04
(1 row)
另请参阅
日期/时间函数7 - TO_NUMBER
转换字符串值为 DOUBLE PRECISION。
行为类型
稳定语法
TO_NUMBER ( expression, [ pattern ] )
参数
- 表达式
- 指定要转换的字符串值,CHAR 或 VARCHAR。
- 模式
- 字符串值,CHAR 或 VARCHAR,它使用支持的 用于数字格式化的模板模式 之一指定输出模式字符串。如果忽略此参数,
TO_NUMBER
返回浮点数。
注意
要在输出中使用双引号字符,请在它前面加上双反斜杠。这样做很有必要,因为反斜杠在字符串常数中已经具有特殊含义。例如: '\\\"YYYY Month\\\"'
示例
=> SELECT TO_NUMBER('MCML', 'rn');
TO_NUMBER
-----------
1950
(1 row)
如果省略了 pattern
参数,则函数返回浮点。例如:
=> SELECT TO_NUMBER('-123.456e-01');
TO_NUMBER
-----------
-12.3456
8 - 用于日期/时间格式化的模板模式
在输出模板字符串(用于 TO_CHAR
)中,某些得到确认的模式会以待格式化值的合适格式化数据替代。非模板模式的文本将逐字复制。同样,在输入模板字符串(用于除 TO_CHAR
之外的任何情形)中,模板模式会识别待查看的输入数据字符串部分,以及要找到的值。
注意
Vertica 对 Vertica 日志文件中的日期/时间字段使用 ISO 8601:2004 样式。例如:
2020-03-25 05:04:22.372 Init Session:0x7f8fcefec700-a000000013dcd4 [Txn] <INFO> Begin Txn: a000000013dcd4 'read role info'
模板模式修饰符
某些修饰符可应用于任何日期/时间模板模式以改变其行为。例如,FMMonth
是带 Month
修饰符的 FM
模式。
示例
使用 TO_TIMESTAMP 来转换使用模式 'YYY MON'
的表达式:
=> SELECT TO_TIMESTAMP('2017 JUN', 'YYYY MON');
TO_TIMESTAMP
---------------------
2017-06-01 00:00:00
(1 row)
使用 TO_DATE 来转换使用模式 'YYY-MMDD'
的表达式:
=> SELECT TO_DATE('2017-1231', 'YYYY-MMDD');
TO_DATE
------------
2017-12-31
(1 row)
9 - 用于数字格式化的模板模式
使用
-
使用 SG、PL 或 MI 格式化的符号不能锚定在数字上。例如:
=> SELECT to_char(-12, 'S9999'), to_char(-12, 'MI9999'); to_char | to_char ---------+--------- -12 | - 12 (1 row)
-
TO_CHAR(-12, 'S9999') 生成 ' -12'
-
TO_CHAR(-12, 'MI9999') 生成 '- 12'
-
-
由于有 9 个 S,因此会生成 9 个相同位数的值。如果一个数字不可用,则会输出一个空格。
-
TH 不会转换小于 0 的值,而且不会转换分数。
-
V 表示使用输入值乘以 10^n,其中 n 是 V 后面的数字位数。TO_CHAR 不支持使用 V 结合小数点。例如:
99.9V99
。