这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

格式化函数

格式化函数是一个强大的工具集,可以将各种数据类型 (DATE/TIME, INTEGER, FLOATING POINT) 转换为格式化的字符串,以及将格式化的字符串转换为特定数据类型。

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)

另请参阅

BITCOUNT

2 - 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)
    
  • TO_CHAR 使用与 EXTRACT 不同的星期编号(请参阅 D 模板模式)。

  • 如果规定 INTERVAL 类型,TO_CHAR 以 HHHH12 作为一天的小时数,而 HH24 可输出超过一天的小时数,例如 >24

  • 要在输出中包含双引号 (") 字符,请在其前面加上双反斜杠 (\\)。这样做很有必要,因为反斜杠在字符串常数中已经具有特殊含义。例如: '\\"YYYY Month\\"'

  • 四舍五入时,如果数字正好是两者的中间值,舍入表示形式的最后一位数应选择偶数。

示例

另请参阅

DATE_PART

3 - TO_DATE

转换字符串值为 DATE 类型。

行为类型

稳定

语法

TO_DATE ( expression , pattern )

参数

表达式
指定要转换的字符串值,CHARVARCHAR
模式
指定输出模式字符串的 CHARVARCHAR。请参阅:

输入值注意事项

TO_DATE 需要 CHARVARCHAR 表达式。对于其他输入类型,请先使用 TO_CHAR 来执行显式强制转换为 CHARVARCHAR,才能使用此函数。

注意

  • 要在输出中使用双引号字符,请在它前面加上双反斜杠。这样做很有必要,因为反斜杠在字符串常数中已经具有特殊含义。例如: '\\\"YYYY Month\\\"'
  • TO_TIMESTAMP如果不使用 FX 选项,则、TO_TIMESTAMP_TZTO_DATE 会跳过输入字符串中的多个空格。必须将 FX 指定为模板中的第一项。例如:

    • TO_TIMESTAMP('2000 JUN', 'YYYY MON') 是正确的。

    • TO_TIMESTAMP('2000 JUN', 'FXYYYY MON') 返回错误,因为 TO_TIMESTAMP 仅接受一个空格。

  • 如果使用多于四个数字的年份,则从字符串到 TIMESTAMPDATEYYYY 转换存在限制。在 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)
    
  • 在从字符串到 TIMESTAMPDATE 的转换中,如果存在 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 )

参数

number
要转换为十六进制的 INTEGERVARBINARY 值。如果您提供 VARBINARY 实参,则函数的返回值没有 0x 前缀。

示例

=> 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:312:3012: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_TZTO_DATE 会跳过输入字符串中的多个空格。必须将 FX 指定为模板中的第一项。例如:

    • TO_TIMESTAMP('2000 JUN', 'YYYY MON') 是正确的。

    • TO_TIMESTAMP('2000 JUN', 'FXYYYY MON') 返回错误,因为 TO_TIMESTAMP 仅接受一个空格。

  • 如果使用多于四个数字的年份,则从字符串到 TIMESTAMPDATEYYYY 转换存在限制。在 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)
    
  • 在从字符串到 TIMESTAMPDATE 的转换中,如果存在 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:312:3012: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_TZTO_DATE 会跳过输入字符串中的多个空格。必须将 FX 指定为模板中的第一项。例如:

    • TO_TIMESTAMP('2000 JUN', 'YYYY MON') 是正确的。

    • TO_TIMESTAMP('2000 JUN', 'FXYYYY MON') 返回错误,因为 TO_TIMESTAMP 仅接受一个空格。

  • 如果使用多于四个数字的年份,则从字符串到 TIMESTAMPDATEYYYY 转换存在限制。在 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)
    
  • 在从字符串到 TIMESTAMPDATE 的转换中,如果存在 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 之外的任何情形)中,模板模式会识别待查看的输入数据字符串部分,以及要找到的值。

模板模式修饰符

某些修饰符可应用于任何日期/时间模板模式以改变其行为。例如,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