首批通过分布式安全可靠测评,为关键业务系统打造
日期时间格式模型
更新时间:2026-04-10 11:58:36
日期时间格式模型(Datetime Format Models)指定了存储在数据库中日期时间数据的格式。
日期时间格式模型的总长度不能超过 22 个字符。当您需要将非默认格式的字符值转换为日期时间格式的值时,可以使用函数中的日期时间格式模型。
日期时间格式模型由一个或多个日期时间格式化元素组成,如果要将字符串值转换为日期值,需要遵从一定的转换规则,请参见 字符串到日期的转换规则。
RR 日期时间格式化元素类似于 YY 日期时间格式化元素,但它为跨世纪日期值的存储提供了额外的灵活性,关于 RR 日式格式化元素,请参见 RR 日期时间格式化元素。
函数中的日期时间格式模型
日期时间格式模型可以在以下函数中使用:
将非默认格式的字符值转换为日期时间值时,需要使用
TO_DATE、TO_TIMESTAMP和TO_TIMESTAMP_TZ函数的参数指定日期时间的格式。将日期时间值转换为非默认格式的字符值时,需要使用
TO_CHAR函数的参数指定输出的字符串的格式。
当用户没有指定格式时,使用默认格式进行转换。您可以通过系统变量 NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT 或 NLS_TIMESTAMP_TZ_FORMAT 显式指定默认日期时间格式。用户可以在 V$NLS_PARAMETERS 系统视图中查询这些变量的值,也可以通过 ALTER SESSION 或者 ALTER SYSTEM 命令修改变量的值。
日期时间格式模型的元素
日期时间格式模型由一个或多个日期时间格式模型元素组成。OceanBase 数据库支持的格式模型元素请查阅 日期时间格式模型元素表。
如果格式用于解析输入的字符串,相同的格式化元素不能出现两次,表示类似信息的格式化元素不能组合。例如,您不能在一个日期时间格式中同时使用
SYYYY和BC元素。这条规则是为了避免信息冗余导致冲突。部分元素不能在
TO_CHAR、TO_DATE、TO_TIMESTAMP和TO_TIMESTAMP_TZ函数中使用。日期时间格式模型元素
FF、TZD、TZH、TZM和TZR可以出现在时间戳和间隔类型的格式中,但不能出现在DATE类型的格式中。部分元素会生成固定长度的字符串,长度不足时会在末尾补充空格。
注意
建议您使用 4 位数的年份元素(
YYYY),较短的年份元素会影响查询优化,因为年份只能在运行时确定。
日期时间格式化元素表
| 元素 | 是否可以用于 TO_* 函数 | 描述 |
|---|---|---|
| - / , 。 ; : "文字" | 是 | 符号字符串常量。 |
| AD A.D. | 是 | 表示公元纪年法。可以带有或不带有点号。 |
| AM A.M. | 是 | 表示上午。可以带有或不带有点号。 |
| BC B.C. | 是 | 表示公元前的年份。可以带有或不带有点号。 |
| CC SCC | 否 | 表示世纪。 |
| D | 是 | 一周的第几(1~7)天。 |
| DAY | 是 | 天的名称。结果的长度是固定的,与名称的最长长度的相同。 |
| DD | 是 | 一个月的第几(1~31)天。 |
| DDD | 是 | 一年的第几(1~366)天。 |
| DY | 是 | 天的名称的缩写。 |
| FF [1..9] | 是 | 小数秒。使用数字 1~9 来指定返回值的小数秒部分的位数,即精度。 默认为日期时间数据类型指定的精度。在时间戳和间隔格式中有效,但在 DATE 格式中无效。 |
| HH | 是 | 小时(1~12)。 |
| HH12 | 否 | 小时(1~12)。12 小时制。 |
| HH24 | 是 | 小时(0~23)。24 小时制。 |
| IW | 否 | 一年的第几周(1~52 或 1~53),基于 ISO 标准。 |
| IYY IY I | 否 | ISO 年份的后 3、2 或 1 位数字。 |
| IYYY | 否 | 包含 4 位数字的年份,基于 ISO 标准。 |
| J | 是 | 儒略日 |
| MI | 是 | 分钟(0~59)。 |
| MM | 是 | 月(01~12)。一月份表示为 01,以此类推。 |
| MON | 是 | 月份的缩写。 |
| MONTH | 是 | 月份名称。结果的长度是固定的,与名称的最长长度的相同。 |
| PM P.M. | 否 | 表示下午。可以带有或不带有点号。 |
| Q | 否 | 季度(1、2、3、4)。1月~3月是第 1 季度,以此类推。 |
| RR | 是 | 年份的后两位,所在世纪取决于输入的两位以及当前年份处于上半世纪还是下半世纪。 如果现在处于上半世纪,那么输入 0~49 年时,结果处于当前世纪,输入 50~99 时结果处于上一世纪。 例如,当前为 2060 年,那么输入 0~49 年时结果为下一世纪,输入 55~99 时结果处于当前世纪。 |
| RRRR | 是 | 年份。接受 4 位或 2 位输入。2位时与 RR 相同。 |
| SS | 是 | 秒(0~59)。 |
| SSSSS | 是 | 当天的秒数(0~86400)。 |
| TZD | 是 | 包含夏令时信息的时区缩写。 例如,PST 表示 US/Pacific 标准时间); PDT 表示 US/Pacific 夏令时时间)。 在时间戳和间隔格式中有效,但在 DATE 格式中无效。 |
| TZH | 是 | 时区的小时部分。 在时间戳和间隔格式中有效,但在 DATE 格式中无效。 |
| TZM | 是 | 时区的分钟部分。 在时间戳和间隔格式中有效,但在 DATE 格式中无效。 |
| TZR | 是 | 时区的区域信息。例如US/Pacific。 在时间戳和间隔格式中有效,但在 DATE 格式中无效。 |
| WW | 否 | 一年的第几(1-53)周。 |
| W | 否 | 一个月的第几(1~5)周。 |
| X | 是 | 本地分隔小数部分的字符。 例如"HH:MI:SSXFF"。 |
| Y,YYY | 是 | 带逗号的年份。 |
| YEAR SYEAR | 否 | 详细说明的年份。 |
| YYYY | 是 | 4 位数字的年份。当前版本暂不支持公元前的日期。 |
| YYY YY Y | 是 | 年份的后 3、2 或 1 位数字。 |
说明
日期时间函数指的是 TO_CHAR、TO_DATE、TO_TIMESTAMP 和 TO_TIMESTAMP_TZ。 注意
- 表格中展示的转化要求输入的字符串日期能够与格式元素相匹配,否则会报错。
- OceanBase 数据库中默认的日期格式为 DD-MON-RR,如果要显示为上面的格式,可以通过执行
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';修改当前会话的日期时间格式。
当您的格式字符串漏掉了一些元素时,会得到系统的报错信息:
obclient> SELECT TO_DATE( '31 Aug 2020', 'DD MON YYY' ) FROM DUAL;
ORA-01830: date format picture ends before converting entire input string
日期格式模型元素中的大写字母
格式中元素的大小写会影响生成的字符串的大小写。例如,日期格式元素 DAY 生成的 MONDAY 也大写,Day 生成 Monday,day 生成小写的 monday。示例如下。
obclient> SELECT TO_CHAR(sysdate,'mon') AS nowMonth FROM DUAL;
+----------+
| NOWMONTH |
+----------+
| mar |
+----------+
1 row in set
obclient> SELECT TO_CHAR(sysdate,'MON') AS nowMonth FROM DUAL;
+----------+
| NOWMONTH |
+----------+
| MAR |
+----------+
1 row in set
日期时间格式模型中的标点符号和字符串常量
用户可以在格式中包含以下字符,这些字符出现在返回值中的位置与格式模型中字符的位置相同:
标点符号,例如连字符、斜杠、逗号、句号和冒号。
字符串常量,使用双引号包含起来。
OceanBase 数据库可以灵活的将字符串转换为日期。当您使用 TO_DATE 函数时,如果输入字符串中的每个数字元素都包含格式模型允许的最大位数,则格式字符串将与输入的字符串匹配。
示例
示例 1 :格式元素 MM/YY,其中 02 对应 MM,07 对应 YY。
obclient> SELECT TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') FROM DUAL; +------------------------------------------+ | TO_CHAR(TO_DATE('0207','MM/YY'),'MM/YY') | +------------------------------------------+ | 02/07 | +------------------------------------------+ 1 row in set示例 2 :OceanBase 数据库允许非字母数字字符与格式化中的标点字符匹配,# 对应 /。
obclient> SELECT TO_CHAR (TO_DATE('02#07','MM/YY'), 'MM/YY') FROM DUAL; +-------------------------------------------+ | TO_CHAR(TO_DATE('02#07','MM/YY'),'MM/YY') | +-------------------------------------------+ | 02/07 | +-------------------------------------------+ 1 row in set
日期格式化元素与全球化支持
在 OceanBase 数据库中,日期时间格式化元素的语言可以通过参数 NLS_DATE_LANGUAGE 和 NLS_LANGUAGE 指定。默认值是 AMERICAN,不支持修改,所以不支持全球化。
示例 :日期时间格式化的语言参数默认是 American,不支持其他语言。
SELECT TO_CHAR (SYSDATE, 'DD/MON/YYYY', 'nls_date_language=''Traditional Chinese'' ') FROM DUAL;
查询结果报错,语言参数不支持。
ORA-12702: invalid NLS parameter string used in SQL function