本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
字符到时间戳 (系统)
Char to Timestamp 函数是最常用的系统函数之一,因为它允许您从任何格式正确的输入字符串中创建时间戳。使用此函数,您可以指定要在后续处理中使用时间戳字符串的哪些部分,并创建仅包含这些部分的 TIMESTAMP 值。为此,您需要指定一个模板来标识所需时间戳的部分。例如,要仅使用年份和月份,则应指定 “yyyyy-mm”。
输入的日期时间字符串可以包含完整时间戳的任何部分('yyyy-mm-dd hh: mm: ss')。如果所有这些元素都存在于您的输入字符串中,并且 'yyyy-mm-DD hh: mm: ss '是您提供的模板,则输入字符串元素将按该顺序解释为年、月、日、小时、分钟和秒,例如 '2009-09-16 03:15:24'。yyyy 不能为大写;hh 可以为大写表示使用 24 小时制。
有关所有有效说明符的信息,请参阅 Oracle 网站 SimpleDateFormat上的类
CHAR_TO_TIMESTAMP 使用您指定的模板作为函数调用中的参数。该模板使 TIMESTAMP 结果仅使用您在模板中指定的部分 input-date-time 值。生成的 TIMESTAMP 中的这些字段包含从您的 input-date-time 字符串中提取的相应数据。模板中未指定的字段将使用默认值(见下文)。CHAR_TO_TIMESTAMP 使用的模板格式由 Oracle 网站上的 Clas SimpleDateFormat
语法如下所示:
CHAR_TO_TIMESTAMP('<format_string>','<input_date_time_string>')
其中,<format_ string> 是您为所需的 <date_time_string> 部分指定的模板,<input_date_time_string> 是将转换为 TIMESTAMP 结果的原始字符串。
请注意,每个字符串必须用单引号引起来,并且 <input_date_time_string> 的每个元素必须位于其在模板中的相应元素的范围内,否则不会返回任何结果。
例如, input-string-element 其位置与 MM 对应的必须是介于 1 到 12 之间的整数,因为其他任何值都不代表有效的月份。同样, input-string-element 其位置与 dd 对应的必须是 1 到 31 之间的整数,因为其他任何内容都不代表有效日期。(但是,如果 MM 为 2,则 dd 不能为 30 或 31,因为 2 月从来没有这样的日子。)
对于小时、分钟或秒,默认起始值为零,因此,当模板中省略这些说明符时,将替换为零。对于月或天,替换省略部分的默认起始值为 01。
例如,使用 “2009-09-16 03:15:24” 作为输入字符串,可以获得仅包含日期的时间戳,其他字段(例如小时、分钟或秒)的值为零。
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')
然后,生成的时间戳将是 2009-01-01 03:15:00。
用于创建特定输出时间戳的模板字符串显示了用于创建指定输出 TimeStamp 的模板和输入字符串的更多说明性示例。
注意
输入字符串必须使用 'yyyy-mm-dd hh: mm: ss '的形式或其子集或重新排序。因此,使用像 “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
由于模板中不存在月份和日期的说明符,因此它们在输入字符串中的值被忽略,输出 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 之前有 a,而不是输入字符串的日期说明中使用的短划线分隔符。
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),则除非还指定了天,否则它将无法指定小时、分钟或秒。