

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

# 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)，则除非还指定了日，否则将无法指定时、分或秒。

# 用于创建特定输出时间戳的模板字符串
<a name="sql-reference-template-strings-create-output-timestamps"></a>




| 模板 | 输入字符串 | 输出TIMESTAMP | 注意 | 
| --- | --- | --- | --- | 
|  'yyyy-MM-dd hh:mm:ss'  |  '2009-09-16 03:15:24'  |  '2009-09-16 03:15:24'  | 
|  'yyyy-mm'  |  '2011-02-08 07:23:19'  |  '2011-01-01 00:02:00'  |  上面的模板仅指定了第一个是年和第二个是分，因此输入字符串中的第二个元素（“02”）用作分。月和日使用默认值（“01”），时和秒使用默认值（“00”）。  | 
|  'MMM dd, yyyy'  |  'March 7, 2010'  |  '2010-03-07 00:00:00'  | 上面模板中的 MMM 与“March”匹配；模板的“逗号空格”与输入字符串匹配。 如果模板缺少逗号，输入字符串也必须缺少逗号，否则就没有输出； 如果输入字符串缺少逗号，模板也必须缺少逗号。 | 
|  'MMM dd,'  |  'March 7, 2010'  |  '1970-03-07 00:00:00'  | 请注意，上面的模板没有使用年说明符，这会导致输出 TIMESTAMP 使用这个时代最早的一年，即 1970。 | 
|  'MMM dd,y'  |  'March 7, 2010'  |  '2010-03-07 00:00:00'  | 使用上面的模板，如果输入字符串是“March 7, 10”，则输出 TIMESTAMP 将是“0010-03-07 00:00:00”。 | 
|  'M-d'  |  '2-8'  |  '1970-02-08 00:00:00'  | 如上所示，模板中没有 yyyy 说明符，因此使用这个时代最早的一年 (1970)。 输入字符串“2–8−2011”将生成相同的结果；使用“2011–2−8”不会生成任何结果，因为 2011 不是有效的月。 | 
|  'MM-dd-yyyy'  |  '06-23-2011 10:11:12'  |  '2011-06-23 00:00:00'  | 如果模板和输入都在相同位置使用短划线作为分隔符（如上所示），则可以使用短划线。由于模板省略了时、分和秒，因此在输出 TIMESTAMP 中都使用零。 | 
|  `'dd-MM-yy hh:mm:ss'`  |  `'23-06-11 10:11:12'`  |  `'2011-06-23 10:11:12'`  | 您可以按任意顺序使用这些说明符，但前提是该顺序与您提供的输入字符串的含义匹配。下面下一个示例的模板和输入字符串与此示例具有相同的含义（和相同的输出 TIMESTAMP），但在日之前指定了月，在时之前指定了秒。 | 
|  `'MM-dd-yy ss:hh:mm'`  |  `'06-23-11 12:10:11'`  |  `'2011-06-23 10:11:12'`  | 在上面使用的模板中，月和日说明符的顺序与上面的示例相反，秒的说明符在时之前而不是分之后；但是由于输入字符串还将月放在日之前，将秒放在时之前，因此含义（和输出 TIMESTAMP）与上面的示例相同。 | 
|  `'yy-dd-MM ss:hh:mm'`  |  `'06-23-11 12:10:11'`  |  `'2006-11-23 10:11:12'`  | 上面使用的模板颠倒了（与上面的前一个示例相比）年和月说明符，而输入字符串保持不变。在本例中，输出 TIMESTAMP 使用输入字符串的第一个元素作为年，第二个元素作为日，第三个元素作为月。 | 
|  `'dd-MM-yy hh:mm'`  |  `'23-06-11 10:11:12'`  |  `'2011-06-23 10:11:00'`  | 如上所示，模板中省略了秒，输出 TIMESTAMP 使用 00 秒。任意数量的 y 说明符都会生成相同的结果；但是如果输入字符串无意中对年使用的是 1 而不是 11，例如在“23-06-1 10:11:12”中，则输出 TIMESTAMP 将变为“0001-06-23 10:11:00”。 | 
|  `'MM/dd/yy hh:mm:ss'`  |  `'12/19/11 10:11:12'`  `'12/19/11 12:11:12'`  |  `'2011-12-19 10:11:12'`  `'12/19/11 00:11:12'`  | 如果模板和输入都在相同位置使用斜杠作为分隔符（如上所示），则可以使用斜杠。使用说明符 hh，输入时间“12:11:10”和“00:11:10”与上午的时间含义相同。 | 
|  `'MM/dd/yy HH:mm:ss'`  |  `'12/19/11 12:59:59'` `'12/19/11 21:08:07'`  `'2011-12-19 00:11:12'` `'2011-12-19 12:11:12'`  |  `'2011-12-19 12:59:59'` `'2011-12-19 21:08:07'`   |  此模板的输入字符串值`'2011-12-19 00:11:12'`或`'2011-12-19 12:11:12'`会失败，因为`'2011'`不是一个月，如模板字符串 required/expected 所示。`'MM/dd/yy HH:mm:ss'` 但是，更改模板会生成有用的输出： <pre>values(cast(CHAR_TO_TIMESTAMP('y/MM/dd HH:mm:ss', '2011/12/19 00:11:12') as<br />varchar(19)));<br />'EXPR$0'<br />'2011-12-19 00:11:12'</pre> 已选定 1 行 对于上述模板 (`'y/MM/dd'`)，`'12/19/11 00:11:12'`会失败，因为 19 不是有效的月；提供“`12/11/19 00:11:12'`有效。 `'2011-12-19 12:11:12'`作为输入会失败，因为短划线与模板中的斜杠不匹配，`'2011/12/19 12:11:12'`有效。 请注意，对于中午 12 点之后的时间，也就是说，对于下午和晚上的时间，时说明符必须是 HH 而不是 hh，并且输入字符串必须以 24 小时制时间指定下午或晚上的时，时从 00 到 23。 使用说明符 HH，输入时间“12:11:10”和“00:11:10”具有不同的含义，第一个是下午的时间，第二个是上午的时间。 使用说明符 hh，从 12:00 到 11:59:59 的时间是上午的时间： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/kinesisanalytics/latest/sqlref/sql-reference-template-strings-create-output-timestamps.html) | 

