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)

另请参阅

日期/时间函数