

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Char To Timestamp(Sys)
<a name="sql-reference-char-to-timestamp"></a>

Char to Timestamp 函数是最常用的系统函数之一，因为允许您使用任何格式正确的输入字符串创建时间戳。使用此函数，您可以指定要在后续处理中使用时间戳字符串的哪些部分，并创建一个仅包含这些部分的 TIMESTAMP 值。为此，您需要指定一个模板来标识所需时间戳的各个部分。例如，要仅使用年和月，则指定“yyyy-MM”。

输入 date-time 字符串可以包含完整时间戳（“yyyy-MM-dd hh:mm:ss”）的任何部分。如果所有这些元素都存在于您的输入字符串中，并且您提供的模板是 'yyyy-MM-dd hh: mm: ss'，则输入字符串元素将按该顺序解释为年、月、日、时、分和秒，例如 '2009-09-16 03:15:24 '。yyyy 不能大写；hh 可以大写，表示使用 24 小时制。

有关所有有效说明符的信息，请参阅 Oracle 网站 SimpleDateFormat上的[类别](http://docs.oracle.com/javase/7/docs/api/index.html?java/text/SimpleDateFormat.html)。

CHAR\$1TO\$1TIMESTAMP 使用您指定的模板作为函数调用中的参数。该模板使 TIMESTAMP 结果仅使用您在模板中指定的部分 input-date-time值。生成的 TIMESTAMP 中的这些字段包含从您的 input-date-time字符串中获取的相应数据。未在模板中指定的字段将使用默认值（请参阅下文）。CHAR\$1TO\$1TIMESTAMP 使用的模板格式由 Oracle 网站上的[类 SimpleDateFormat](http://docs.oracle.com/javase/7/docs/api/index.html?java/text/SimpleDateFormat.html)定义。有关更多信息，请参阅[日期和时间模式](sql-reference-parse-timestamp-format.md)。

函数调用语法如下：

```
CHAR_TO_TIMESTAMP('<format_string>','<input_date_time_string>')
```

其中，<format\$1 string> 是您为所需的 <date\$1time\$1string> 部分指定的模板，<input\$1date\$1time\$1string> 是将转换为 TIMESTAMP 结果的原始字符串。

请注意，每个字符串必须用单引号引起来，并且 <input\$1date\$1time\$1string> 的每个元素必须位于其在模板中的相应元素的范围内，否则不会返回任何结果。

例如，位置与 MM 对应的，必须是介于 1 到 12 之间的整数，因为其他任何内容都不能代表有效的月份。 input-string-element同样，与 dd 对应的位置必须是介于 1 到 31 之间的整数，因为其他任何东西都不能代表有效的日期。 input-string-element（但是，如果 MM 为 2，则 dd 不能是 30 或 31，因为 2 月没有这几日。）

对于时、分或秒，默认起始值为零，因此当模板中省略这些说明符时，将替换为零。对于月或日，替换省略部分的默认起始值为 01。

例如，使用“2009-09-16 03:15:24”作为输入字符串，您可以获得仅包含日期的 TIMESTAMP，其他字段（例如时、分或秒）为零。

```
 CHAR_TO_TIMESTAMP('yyyy-MM-dd','2009-09-16 03:15:24').
```

结果将是 TIMESTAMP 2009-09-16 00:00:00。

如果调用在模板中保留了时和分，但省略了月、日和秒，如以下调用所示。

```
--- --- CHAR_TO_TIMESTAMP('yyyy-hh-mm','2009-09-16 03:15:24')
```

然后，生成的 TIMESTAMP 将是 2009-01-01 03:15:00。

[用于创建特定输出时间戳的模板字符串](sql-reference-template-strings-create-output-timestamps.md)显示了用于创建指定输 TIMESTAMPs出的模板和输入字符串的更多说明性示例。

**注意**  
输入字符串必须使用 'yyyy-MM-dd hh: mm: ss' 的形式或其子集或重新排序。因此，使用“Wednesday, 16 September 2009 03:15:24”这样的输入字符串将不起作用，这意味着不会生成任何输出。

## 关于分隔符和值
<a name="w2aac22c17c19c29c39"></a>

模板中的分隔符必须与输入字符串中的分隔符匹配，并且输入字符串中的值必须是其对应的模板说明符可以接受的。

按照一般惯例，冒号用于分隔时和分以及分和秒。同样，一般惯例是使用短划线或斜杠分隔年和月以及月和日。

例如，以下模板的值与输入字符串正确一致。

```
values (CHAR_TO_TIMESTAMP('MM/dd/yy hh:mm:ss','09/16/11 03:15:24') );
'EXPR$0'
'2011-09-16 03:15:24'
1 row selected
```

如果输入字符串中的值是其对应的模板说明符不可接受的，则结果将失败，如下例所示。

```
values (CHAR_TO_TIMESTAMP('MM/dd/yy hh:mm:ss','2009/09/16 03:15:24') );
'EXPR$0'
No rows selected
```

此示例未返回任何行，因为 2009 不是可接受的月值，月是模板中的第一个说明符 (MM)。

提供的字符串中的省略可能会导致模板值“yyyy”生成合乎逻辑但意想不到或出乎意料的结果。以下示例返回的均是错误的年，但其直接派生自所提供字符串中的第一个元素。

```
 VALUES(CHAR_TO_TIMESTAMP('yyyy','09-16 03:15'));
'EXPR$0'
'0009-01-01 00:00:00'
1 row selected
VALUES(CHAR_TO_TIMESTAMP('yyyy','16 03:15'));
'EXPR$0'
'0016-01-01 00:00:00'
1 row selected
```

## 使用模板创建 TIMESTAMPS 的示例
<a name="w2aac22c17c19c29c41"></a>

模板的顺序必须与输入字符串匹配。这意味着您不能在“yyyy”之后指定“hh”，也不能期望该方法自动找到时。例如，以下模板先指定年，后指定时，最后指定分，但返回错误的结果。

```
 values (CHAR_TO_TIMESTAMP('yyyy-hh-mm','2009-09-16 03:15:24'));
'EXPR$0'
'2009-01-01 09:16:00'
1 row selected
```

由于模板中不存在月和日的说明符，因此其在输入字符串中的值被忽略，输出 TIMESTAMP 中的这两个值都替换为 01。模板指定了时和分作为第二和第三个输入值，因此 09 成为了时，16 成为了分。秒没有说明符，因此使用了 00。

年说明符可以单独使用，也可以在与输入字符串匹配的分隔符之后显示年说明符结束，其中一个是 hours:minutes:seconds 说明符。

```
values (CHAR_TO_TIMESTAMP('yyyy','2009-09-16 03:15:24') );
'EXPR$0'
'2009-01-01 00:00:00'
1 row selected
```

 相比之下，下面的模板失败了，因为它在输入字符串的日期规范中使用了 “hh” space-as-delimiter 之前的分隔符，而不是破折号分隔符。

```
  values (CHAR_TO_TIMESTAMP('yyyy hh','2009-09-16 03:15:24') );
  'EXPR$0'
  No rows selected
```

下面的四个模板之所以起作用，是因为使用相同的分隔符将年说明符与下一个说明符分隔，就像在输入字符串的日期规范中使用的那样（第一个示例中是短划线，第二个示例中是空格，第三个示例中是斜杠，第四个示例中是短划线）。

```
values (CHAR_TO_TIMESTAMP('yyyy-hh','2009-09-16 03:15:24') );
'EXPR$0'
'2009-01-01 09:00:00'
1 row selected
values (CHAR_TO_TIMESTAMP('yyyy hh','2009 09 16 03:15:24') );
'EXPR$0'
'2009-01-01 09:00:00'
1 row selected
values (CHAR_TO_TIMESTAMP('yyyy/hh','2009/09/16 03:15:24') );
'EXPR$0'
'2009-01-01 09:00:00'
1 row selected
values (CHAR_TO_TIMESTAMP('yyyy-mm','2009-09-16 03:15:24') );
'EXPR$0'
'2009-01-01 00:09:00'
1 row selected
```

但是，如果模板指定了月 (MM)，则除非还指定了日，否则将无法指定时、分或秒。