CAST - Amazon Kinesis Data Analytics
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

CAST

CAST 允许您将一个值表达式或数据类型转换为另一个值表达式或数据类型。

CAST ( <cast-operand> AS <cast-target> ) <cast-operand> := <value-expression> <cast-target>  := <data-type>

有效转换

通过将 CAST 与下方第一列中列出的类型的源操作数结合使用,可不受限制地创建强制转换目标类型,如第二列中所示。不支持其他目标类型。

源操作数类型 目标操作数类型

任何数字类型 (NUMERIC、DECIMAL、SMALLINT、INTEGER、BIGINT、REAL、DOUBLE)

VARCHAR、CHAR 或任何数字类型 (请参阅注释 A。)

VARCHAR、CHAR

上述所有类型,以及 DATE、TIME、TIMESTAMP、DAY-TIME INTERVAL、BOOLEAN

DATE

DATE、VARCHAR、CHAR、TIMESTAMP

TIME

TIME、VARCHAR、CHAR、TIMESTAMP

TIMESTAMP

TIME、VARCHAR、CHAR、TIMESTAMP、DATE

DAY-TIME INTERVAL

DAY-TIME INTERVAL、BIGINT、DECIMAL、CHAR、VARCHAR

BOOLEAN

VARCHAR、CHAR、BOOLEAN

BINARY、VARBINARY

BINARY、VARBINARY

示例

2.1 DATE 到 CHAR/VARCHAR

+-------------+ |   EXPR$0    | +-------------+ | 2008-08-23  | +-------------+ 1 row selected

(请注意,如果提供的输出规范不充分,则不会选择任何行:

values(cast(date'2008-08-23' as varchar(9))); 'EXPR$0' No rows selected

(因为日期文本需要 10 个字符)

在下一个示例中,日期右侧填补空格 (因为 CHAR 数据类型的语义):

+----------------------------+ |           EXPR$0           | +----------------------------+ | 2008-08-23                 | +----------------------------+ 1 row selected

REAL 到 INTEGER

实数 (NUMERIC 或 DECIMAL) 将通过强制转换取整:

+---------+ | EXPR$0  | +---------+ | -2      | +---------+ 1 row selected

STRING 到 TIMESTAMP

可通过两种方式将字符串转换为时间戳。第一种方式是使用 CAST,如下一主题中所示。另一种方式是使用 Char To Timestamp(Sys)

使用 CAST 将字符串转换为时间戳

以下示例说明了此转换方式:

'EXPR$0' '2007-02-19 21:23:45' 1 row selected

如果输入字符串缺少 6 个字段 (年、月、日、小时、分钟、秒) 之一,或使用与上面显示的分隔符不同的任何分隔符,则 CAST 将不会返回值。(禁止使用小数秒。)

如果输入字符串未采用正确的 CAST 格式,要将字符串转换为时间戳,您必须使用 CHAR_TO_TIMESTAMP 方法。

使用 CHAR_TO_TIMESTAMP 将字符串转换为时间戳

如果输入字符串未采用正确的 CAST 格式,您可使用 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 小时制。有关有效说明符的多个示例,请参阅此表和本主题后面的示例。有关有效说明符的完整范围,请参阅 Oracle 网站上的 SimpleDateFormat 类

CHAR_TO_TIMESTAMP 在函数调用中使用您指定的模板作为参数。该模板促使 TIMESTAMP 结果仅使用您在模板中指定的输入日期时间值的某个部分。随后,结果 TIMESTAMP 中的那些字段将包含取自您的输入日期时间字符串的相应数据;您的模板中未指定的字段将使用默认值 (见下文)。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> 的每个元素必须位于其在模板中的相应元素的范围内。否则,不会返回任何结果。

示例 1

  • 其位置对应于 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').

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

示例 2

  • 如果调用在模板中保留了小时和分钟,同时省略了月、日和秒,如以下调用中所示 --- --- CHAR_TO_TIMESTAMP('yyyy-hh-mm','2009-09-16 03:15:24') --- --- 则结果 TIMESTAMP 将为 2009-01-01 03:15:00。

模板 输入字符串 输出时间戳 备注
'yyyy-MM-dd hh:mm:ss' '2009-09-16 03:15:24' '2009-09-16 03:15:24'

输入字符串必须使用 'yyyy-MM-dd hh:mm:ss' 格式或子集,或对其进行重新排序;使用类似 'Wednesday, 16 September 2009 03:15:24' 这样的输入字符串将不起作用,这意味着不会生成任何输出。

'yyyy-mm' '2012-02-08 07:23:19' '2012-01-01 00:02:00'

上述模板仅指定了年作为第一个元素,并指定分钟作为第二个元素,因此输入字符串中的第二个元素 (“02”) 将用作分钟。

默认值用于月和日 (“01”) 以及小时和秒 (“00”)。

'yyyy-ss-mm' '2012-02-08 07:23:19' '2012-01-01 00:08:02'

上述模板仅指定年、秒和分钟,按照这一顺序,输入字符串中的第二个元素 (“02”) 将用作秒,第三个元素将用作分钟 (“08”)。月和日将使用默认值 (“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'

请注意,上述模板未使用年说明符,从而导致输出时间戳使用了此纪元中最早的年 1970。

'MMM dd,y' 'March 7, 2010' '2010-03-07 00:00:00'

当使用上述模板时,如果输入字符串为 'March 7, 10',输出时间戳将为 '0010-03-07 00:00:00'。

'M-d' '2-8' '1970-02-08 00:00:00'

如上所示,模板中缺少 yyyy 说明符,将使用此纪元中最早的年 (1970)。

输入字符串 '2-8-2012' 将生成相同的结果;使用 '2012-2-8' 将不会生成结果,因为 2012 不是有效月份。

'MM-dd-yyyy' '06-23-2012 10:11:12' '2012-06-23 00:00:00'

如果模板和输入在相同的位置使用了短划线,则可以将短划线用作分隔符 (如上所示)。由于模板忽略了小时、分钟和秒,输出时间戳中使用了零。

'dd-MM-yy hh:mm:ss' '23-06-11 10:11:12' '2011-06-23 10:11:12'

您可按任意顺序对说明符排序,前提是顺序与您提供的输入字符串的含义相符,如上所述。下面的下一个示例的模板和输入字符串与本示例中的模板和输入字符串具有相同的含义 (和相同的输出时间戳),但前者在天之前指定了月并在小时之前指定了秒。

'MM-dd-yy ss:hh:mm' '06-23-11 12:10:11' '2011-06-23 10:11:12'

在上面使用的模板中,月说明符和日说明符的顺序与正上方的示例中的相反,且秒的说明符在小时之前,而不是分钟之后;但由于输入字符串也将月放在日之前,将秒放在小时之前,其含义 (以及输出时间戳) 与前一个示例的相同。

'yy-dd-MM ss:hh:mm' '06-23-11 12:10:11' '2006-11-23 10:11:12'

上面使用的模板反转了年说明符和月说明符的位置 (与上面的前一个示例相比),而输入字符串保持不变。在这种情况下,输出时间戳使用输入字符串的第一个元素作为年,第二个元素作为日,第三个元素作为月。

'dd-MM-yy hh:mm' '23-06-11 10:11:12' '2011-06-23 10:11:00'

如上所示,由于模板中忽略了秒,输出时间戳将使用 00 秒。任意数量的 y 说明符都将产生相同的结果;但如果输入字符串无意中使用了 1 而不是 11 作为年 (例如在 '23-06-1 10:11:12' 中),输出时间戳将变成 '0001-06-23 10:11:00'。

'MM/dd/yy hh:mm:ss'

'12/19/11 10:11:12'

'12/19/11 12:11:10'

'2011-12-19 10:11:12'

'2011-12-19 00:11:10'

可以使用斜杠作为分隔符,前提是模板和输入都在相同位置使用它们 (如上所述);否则,无输出。

当使用说明符 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 12:59:59' '2011-12-19 21:08:07'

输入字符串值 '2011-12-19 00:11:12' 或 '2011-12-19 12:11:12' 将因该模板失败,因为“2011”不是模板字符串 'MM/dd/yy HH:mm:ss' 所需的月份。

但是,更改模板将提供有用的输出:

values(cast(CHAR_TO_TIMESTAMP('y/MM/dd HH:mm:ss', '2011/12/19 00:11:12') as varchar(19))); 'EXPR$0' '2011-12-19 00:11:12' 1 row selected

'12/19/11 00:11:12' 将因上述模板 ('y/MM/dd') 而失败,因为 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 的时间是上午的时间:

--- --- 假设使用说明符 hh:mm:ss,输出 TIMESTAMP 将包含输入字符串 '12:09:08' 和输入字符串 '00:09:08' 中的 '00:09:08' (上午);

--- --- 而

--- --- 假设使用说明符 HH:mm:ss,输入字符串 '00:09:08' (上午) 的输出 TIMESTAMP 将包含 '00:09:08'

--- --- 并且输入字符串 '12:09:08' (下午) 的输出 TIMESTAMP 将包含 '12:09:08'。

更多示例

以下示例说明如何将各个模板与 CHAR_TO_TIMESTAMP 结合使用,包括一些常见的误解。

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 values (CHAR_TO_TIMESTAMP('yyyy hh','2009-09-16 03:15:24') ); 'EXPR$0' No rows selected

上述模板将失败,因为它在“hh”前使用空格作为分隔符,而未使用输入字符串的日期规范中使用的短横线分隔符;

而下方的 4 个模板有效,因为它们依据输入字符串的日期规范使用分隔符来分隔年说明符与下一个说明符 (第一个示例中使用短横线,第二个示例中使用空格,第三个示例中使用斜杠,第四个示例中使用短横线)。

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),除非还指定日,否则它无法指定小时、分钟或秒:

模板仅指定年和月,因此将在结果 TIMESTAMP 中省略日/小时/分钟/秒:

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

接下来的两个模板将失败,并且没有“日”说明符:

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

接下来的三个模板成功,并且使用了“日”说明符:

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

上述模板 'yyyy-MM-dd hh' 仅指定小时 (hh),而没有分钟或秒。由于 hh 是模板的第 4 个标记/元素,其值取自输入字符串 '2009-09-16 03:15:24' 的第 4 个标记/元素;第 4 个元素为 03,随后将用作小时的值输出。由于 mm 和 ss 均未指定,将使用定义为 mm 和 ss 的起点的默认值或初始值 (均为零)。

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

上述模板 'yyyy-MM-dd ss' 指定输入字符串的第 4 个标记/元素将用作秒 (ss)。输入字符串 '2009-09-16 03:15:24' 的第 4 个元素为 03,其将成为秒的值输出,如模板中所指定;由于模板中未指定 hh 和 mm,将使用其默认值或初始值 (均为零)。

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

上述模板 'yyyy-MM-dd mm' 指定输入字符串的第 4 个标记/元素将用作分钟 (mm)。输入字符串 '2009-09-16 03:15:24' 的第 4 个元素为 03,其将成为分钟的值输出,如模板中所指定;由于模板中未指定 hh 和 ss,将使用其默认值或初始值 (均为零)。

再次失败,缺少“日”说明符:

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

关于分隔符和值

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

一般约定是,冒号用于分隔小时和分钟以及分钟和秒。同样,一般约定为使用短横线或斜杠将年和月分开并将月和日分开。所有并行使用似乎都有效,后续示例将说明这一点。

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

上述示例失败,因为 2009 不是可接受的月份值,而是模板中的第一个说明符 (MM)。

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','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','09/16/11 03-15-24') ); 'EXPR$0' '2011-09-16 03:15:24' 1 row selected values (CHAR_TO_TIMESTAMP('yyyy|MM|dd hh|mm|ss','2009|09|16 03|15|24') ); 'EXPR$0' '2009-09-16 03:15:24' 1 row selected values (CHAR_TO_TIMESTAMP('yyyy@MM@dd hh@mm@ss','2009@09@16 03@15@24') ); 'EXPR$0' '2009-09-16 03:15:24' 1 row selected

上述示例成功,因为分隔符是并列的,并且值是每个说明符可接受的。

在以下示例中,请注意,提供的字符串中的省略可能导致模板值“yyyy”生成合理但意外的结果。结果 TIMESTAMP 值中指定为年的值直接派生自提供的字符串中的第一个元素。

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

TIMESTAMP 到 STRING

values(cast( TIMESTAMP '2007-02-19 21:25:35' AS VARCHAR(25))); 'EXPR$0' '2007-02-19 21:25:35' 1 row selected

请注意,CAST 要求 TIMESTAMP 文本具有 'yyyy-mm-dd hh:mm:ss' 的完整格式。如果缺少完整格式的任何部分,此文本将因非法而被拒绝,如下所示:

values( TIMESTAMP '2007-02-19 21:25'); Error: Illegal TIMESTAMP literal '2007-02-19 21:25':                                  not in format 'yyyy-MM-dd HH:mm:ss' (state=,code=0) values( TIMESTAMP '2007-02-19 21:25:00'); 'EXPR$0' '2007-02-19 21:25:00' 1 row selected

此外,如果提供的输出规范不充分,则不会选择任何行:

values(cast( TIMESTAMP '2007-02-19 21:25:35' AS VARCHAR(18))); 'EXPR$0' No rows selected (Because the timestamp literal requires 19 characters)

这些限制同样适用于到 TIME 或 DATE 类型的转换。

STRING 到 TIME

values(cast(' 21:23:45.0' AS TIME)); 'EXPR$0' '21:23:45' 1 row selected

有关更多信息,请参见注释 A。

STRING 到 DATE

values(cast('2007-02-19' AS DATE)); 'EXPR$0' '2007-02-19' 1 row selected
注释 A

请注意,字符串的 CAST 要求转换为 TIME 或 DATE 的字符串操作数具有分别表示 TIME 或 DATE 的准确格式。

如下所示,转换将在下列情况下失败:

  • 字符串操作数包含与目标类型无关的数据,或

  • INTERVAL 操作数 ('day hours:minutes:seconds.milliseconds') 未包含必需的数据,或

  • 指定的输出字段太小,无法包含转换结果。

values(cast('2007-02-19 21:23:45.0' AS TIME)); 'EXPR$0' No rows selected

失败,因为它包含不允许作为 TIME 的日期信息。

values(cast('2007-02-19 21:23:45.0' AS DATE)); 'EXPR$0' No rows selected

失败,因为它包含不允许作为 DATE 的时间信息。

values(cast('2007-02-19 21' AS DATE)); 'EXPR$0' No rows selected

失败,因为它包含不允许作为 DATE 的时间信息。

values(cast('2009-02-28' AS DATE)); 'EXPR$0' '2009-02-28' 1 row selected

成功,因为它包含日期字符串的正确表示形式。

values(CAST (cast('2007-02-19 21:23:45.0' AS TIMESTAMP) AS DATE)); 'EXPR$0' '2007-02-19' 1 row selected

成功,因为它在转换为 DATE 之前将字符串正确转换为 TIMESTAMP。

values(cast('21:23' AS TIME)); 'EXPR$0' No rows selected

失败,因为它缺少 TIME 所需的时间信息 (秒)。

(允许指定小数秒,但不要求这样做。)

values(cast('21:23:34:11' AS TIME)); 'EXPR$0' No rows selected

失败,因为它包含小数秒的错误表示形式。

values(cast('21:23:34.11' AS TIME)); 'EXPR$0' '21:23:34' 1 row selected

成功,因为它包含小数秒的正确表示形式。

values(cast('21:23:34' AS TIME)); 'EXPR$0' '21:23:34' 1 row selected

此示例成功,因为它包含秒的正确表示形式,不含秒的小数部分。

INTERVAL 到准确数字

间隔的 CAST 要求 INTERVAL 操作数只有一个字段,如 MINUTE、HOUR、SECOND。

如果 INTERVAL 操作数具有多个字段 (如 MINUTE TO SECOND),转换将失败,如下所示:

values ( cast (INTERVAL '120' MINUTE(3) as decimal(4,2))); +---------+ | EXPR$0  | +---------+ +---------+ No rows selected values ( cast (INTERVAL '120' MINUTE(3) as decimal(4))); +---------+ | EXPR$0  | +---------+ | 120     | +---------+ 1 row selected values ( cast (INTERVAL '120' MINUTE(3) as decimal(3))); +---------+ | EXPR$0  | +---------+ | 120     | +---------+ 1 row selected values ( cast (INTERVAL '120' MINUTE(3) as decimal(2))); +---------+ | EXPR$0  | +---------+ +---------+ No rows selected values cast(interval '1.1' second(1,1) as decimal(2,1)); +---------+ | EXPR$0  | +---------+ | 1.1     | +---------+ 1 row selected values cast(interval '1.1' second(1,1) as decimal(1,1)); +---------+ | EXPR$0  | +---------+ +---------+ No rows selected

对于年,禁止使用小数作为输入和输出。

values cast(interval '1.1' year (1,1) as decimal(2,1)); Error: org.eigenbase.sql.parser.SqlParseException: Encountered "," at line 1, column 35. Was expecting:    ")" ... (state=,code=0) values cast(interval '1.1' year (1) as decimal(2,1)); Error: From line 1, column 13 to line 1, column 35:              Illegal interval literal format '1.1' for INTERVAL YEAR(1) (state=,code=0) values cast(interval '1.' year (1) as decimal(2,1)); Error: From line 1, column 13 to line 1, column 34:              Illegal interval literal format '1.' for INTERVAL YEAR(1) (state=,code=0) values cast(interval '1' year (1) as decimal(2,1)); +---------+ | EXPR$0  | +---------+ | 1.0     | +---------+ 1 row selected

有关更多示例,请参阅 SQL 运算符:更多示例。

限制

Amazon Kinesis Data Analytics 不支持直接将数字值转换为时间间隔值。这偏离了 SQL:2008 标准。将数字转换为时间间隔的建议方法是针对特定时间间隔值乘以数字值。例如,将整数 time_in_millis 转换为日期-时间时间间隔:

time_in_millis * INTERVAL '0 00:00:00.001' DAY TO SECOND

例如:

values cast( 5000 * (INTERVAL '0 00:00:00.001' DAY TO SECOND) as varchar(11)); 'EXPR$0' '5000' 1 row selected