日期时间格式化出现在下面的数据类型转换中:

  • 将非默认格式的字符值转换为日期时间值时,需要 、TO_TIMESTAMPTO_TIMESTAMP_TZ 函数的参数指定日期时间的格式。
  • 将日期时间值转换为非默认格式的字符值时,需要指定 TO_CHAR 函数的参数。

您可以通过以下方式指定日期时间格式。

  • 通过会话参数 NLS_DATE_FORMATNLS_TIMESTAMP_FORMATNLS_TIMESTAMP_TZ_FORMAT 显式指定。
  • 通过会话参数 NLS_TERRITORY 隐式指定。
  • ALTER SESSION 语句更改会话的默认日期时间格式。

日期时间格式化由一个或多个日期时间格式化元素组成。OceanBase 支持的格式化元素请查阅 日期时间格式化元素表。

  • 在格式化字符串中,相同的格式化元素不能出现两次,表示类似信息的格式化元素不能组合。例如,您不能在一个格式化字符串中同时使用 SYYYYBC 元素。
  • 所有格式化元素都可以在 TO_CHARTO_DATETO_TIMESTAMPTO_TIMESTAMP_TZ 函数中使用。
  • 日期时间格式化元素 FFTZDTZHTZMTZR 可以出现在时间戳和间隔格式化中,但不能出现在 DATE 格式中。

日期时间函数指的是 TO_CHARTO_DATETO_TIMESTAMPTO_TIMESTAMP_TZ

注意,以上转化要求输入的字符串日期能够与格式元素相匹配,否则会报错,例如:

当你的格式串漏掉了一些元素时,会得到系统的报错信息:

  1. SELECT TO_DATE( '31 Aug 2020', 'DD MON YYY' ) FROM DUAL;
  2. ORA-01830: date format picture ends before converting entire input string

拼写出来的单词、缩写词或罗马数字中的大写字母在相应的格式元素中也跟着大写。例如,日期格式元素 DAY 产生的 MONDAY 也大写,DayMonday 格式一样,daymonday 格式一样。

  1. OceanBase(SYS@SYS)>SELECT TO_CHAR(sysdate,'mon') AS nowMonth FROM DUAL;
  2. +----------+
  3. | NOWMONTH |
  4. +----------+
  5. +----------+
  6. OceanBase(SYS@SYS)>SELECT TO_CHAR(sysdate,'MON') AS nowMonth FROM DUAL;
  7. +----------+
  8. | NOWMONTH |
  9. +----------+
  10. +----------+

以下字符需要日期格式化,这些字符出现在返回值中的位置与格式化中字符的位置相同:

  • 标点符号,例如连字符,斜杠,逗号,句号和冒号。
  • 字符字面量,用双引号引起来。
  • 示例 1:格式元素 MM/YY,其中 02 对应 MM07 对应 YY

执行以下语句:

查询结果如下:

  1. +------------------------------------------+
  2. | TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') |
  3. +------------------------------------------+
  4. | 02/07 |
  5. +------------------------------------------+
  • 示例 2:OceanBase 允许非字母数字字符与格式化中的标点字符匹配,# 对应 /

执行以下语句:

  1. SELECT TO_CHAR (TO_DATE('02#07','MM/YY'), 'MM/YY') FROM DUAL;

查询结果如下:

在 OceanBase 数据库中,日期时间格式化元素的语言可以通过参数 NLS_DATE_LANGUAGENLS_LANGUAGE 指定。默认值是 AMERICAN,不支持修改,所以不支持全球化。

  1. SELECT TO_CHAR (SYSDATE, 'DD/MON/YYYY', 'nls_date_language=''Traditional Chinese'' ') FROM DUAL;

查询结果报错,语言参数不支持。

  1. ERROR-12702: invalid NLS parameter string used in SQL function