字符至时间戳 (Sys) - Amazon Kinesis Data Analytics
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

字符至时间戳 (Sys)

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

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

有关有效说明符的完整范围,请参阅 Oracle 网站上的 SimpleDateFormat 类

CHAR_TO_TIMESTAMP 使用您在函数调用中指定的模板作为参数。该模板使 TIMESTAMP 结果仅使用您在模板中指定的输入日期-时间值的部分。生成的 TIMESTAMP 中的这些字段包含从输入日期-时间字符串中获取的相应数据。模板中未指定的字段将使用默认值(见下文)。CHAR_TO_TIMESTAMP 所使用的模板的格式是由 Oracle 网站上的 SimpleDateFormat 类定义的。有关更多信息,请参阅日期和时间模式

函数调用语法如下:

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

其中,<format_ string> 是您为所需的 <date_time_string> 部分指定的模板,<input_date_time_string> 是将转换为 TIMESTAMP 结果的原始字符串。

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

例如,位置与 MM 对应的输入字符串元素必须是 1 到 12 之间的整数,因为其他任何东西都不代表有效月份。同样,位置与 dd 对应的输入字符串元素必须是 1 到 31 之间的整数,因为其他任何东西都不代表有效日期。但是,如果 MM 为 2,dd 不能为 30 或 31,因为二月份从来没有这样的日子。)

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

例如,使用 '2009-09-16 03:15:24 '作为输入字符串,您可以获得一个只包含日期的 TIMESTAMP,其他字段(如小时、分钟或秒)为零。

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

结果将是时间戳 2009 年 9 月 9 日至 16 日 00:00:00。

如果呼叫在模板中保留了小时和分钟,同时省略了月、天和秒,如下面的调用所示。

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

然后,生成的时间戳将是 2009-01-01 年 3 月 15 日的时间戳。

用于创建特定输出时间戳的模板字符串显示了用于创建指定输出 TimePatk 的模板和输入字符串的进一步说明示例。

注意

输入字符串必须使用 'yyy-MM-MM-MM-MM-MM-MM-MM-dd hh: mm: s' 或其子集或重新排序。因此,使用像 “2009 年 9 月 16 日星期三 03:15:24” 这样的输入字符串将不起作用,这意味着不会产生任何输出。

关于分隔符和值

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

作为一般惯例,冒号用于将小时与分钟分隔,分钟与秒分隔。同样,一般惯例是使用短划线或斜杠将年份从月份和月份与天数分开。

例如,以下模板具有与输入字符串正确对齐的值。

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

使用模板创建时间戳的示例

模板的顺序必须与输入字符串匹配。这意味着您不能在 “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

由于月份和天的说明符不存在于模板中,因此它们在输入字符串中的值将被忽略,01 代替输出 TIMESTAMP 中的两个值。模板指定小时和分钟作为第二个和第三个输入值,所以 09 变成小时,16 个成为分钟。几秒钟内没有说明符,因此使用了 00。

年份说明符可以是单独的,也可以在与输入字符串匹配的分隔符之后显示年份说明符的结束,其中一个小时:分钟:秒说明符。

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

相比之下,下面的模板失败,因为它在 “hh” 之前有一个空格分隔符,而不是输入字符串的日期规范中使用的破折号分隔符。

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),则无法指定小时、分钟或秒,除非还指定了天数。