本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
字符转时间戳 (Sys)
Char to Timestamp 函数是最常用的系统函数之一,因为它允许你从任何格式正确的输入字符串中创建时间戳。使用此函数,您可以指定要在后续处理中使用时间戳字符串的哪些部分,并创建仅包含这些部分的 TIMESTAMP 值。为此,您需要指定一个标识所需时间戳部分的模板。例如,要仅使用年和月,应指定 'yyyy-mm '。
输入的日期时间字符串可以包含完整时间戳的任何部分('yyyy-mm-dd hh: mm: ss')。如果所有这些元素都存在于您的输入字符串中,并且'yyyy-mm-dd hh: mm: ss'是您提供的模板,则输入字符串元素将按该顺序解释为年、月、日、时、分和秒,例如 '2009-09-16 03:15:24 '。yyyy 不能是大写字母;hh 可以是大写字母,表示使用 24 小时时钟。
有关所有有效说明符的信息,请参见类 SimpleDateFormat
CHAR_TO_TIMESTAMP 在函数调用中使用您指定的模板作为参数。该模板使得 TIMESTAMP 结果仅使用 TIMESTAMP 的部分内容 input-date-time 您在模板中指定的值。生成的 TIMESTAMP 中的那些字段包含从你的 TIMESTAMP 中提取的相应数据 input-date-time 字符串。模板中未指定的字段将使用默认值(见下文)。CHAR_TO_TIMESTAMP 使用的模板格式由类 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。
用于创建特定输出时间戳的模板字符串显示了用于创建指定输出 TimeStamps 的模板和输入字符串的更多说明性示例。
输入字符串必须使用 “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
相比之下,下面的模板失败是因为它有一个 space-as-delimiter 在 “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),则除非还指定了天,否则无法指定小时、分钟或秒。