CAST - Amazon Kinesis Data Analytics

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

CAST

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

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

有效转换

将 CAST 与下面第一列中列出的类型的源操作数一起使用 CAST 可以不受限制地创建第二列中列出的转换目标类型。不支持其他目标类型。

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

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

VARCHAR、CHAR 或任何数字类型(参见注释 A.)

VARCHAR,CHAR

以上所有内容,加上日期、时间、时间戳、日-时间间隔、布尔值

DATE

日期、VARCHAR、CHAR、时间戳

TIME

时间、VARCHAR、CHAR、时间戳

TIMESTAMP

时间、VARCHAR、CHAR、时间戳、日期

一天-时间间隔

日间隔、BIGINT、十进制、CHAR、VARCHAR

BOOLEAN

VARCHAR、CHAR、BOOLEAN

二进制和变二进制的

二进制和变二进制的

示例

2.1 与 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

实数到整数

实数(数字或十进制)由强制转换四舍五入:

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

将字符串转换为时间戳

将字符串转换为时间戳的方法有两种。第一个使用 CAST,如下一主题所示。其他用途字符到时间戳 (系统)

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

以下示例说明了这种转换方法:

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

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

因此,如果输入字符串的格式不适合 CAST,则要将字符串转换为时间戳,必须使用 CHAR_TO_TIMESTAMP 方法。

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

当输入字符串的格式不适合 CAST 时,可以使用 CHAR_TO_TIMESTAMP 方法。它的另一个优点是,您可以指定要在后续处理中使用时间戳字符串的哪些部分,并创建仅包含这些部分的 TIMESTAMP 值。为此,您需要指定一个模板来确定要使用哪些部分,例如 “yyyy-mm” 仅使用年份和月份部分。

input-date-time string-to-be-converted 可以包含完整时间戳的全部或任意部分,即任何或所有标准元素的值('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 使用的模板格式由 Class 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

  • 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。

示例 2

  • 如果调用在模板中保留了小时和分钟,同时省略了月、天和秒,如以下调用所示----CHAR_TO_TIMESTAMP (yyyy-hh-mm','2009-09-16 03:15:24')---那么生成的时间戳将是 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” 的形式或其子集或重新排序;使用像 “2009 年 9 月 16 日星期三 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'

请注意,上面的模板不使用年份说明符,导致输出 TIMESTAMP 使用这个时代最早的年份,即 1970 年。

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

使用上面的模板,如果输入字符串是 “10 年 3 月 7 日”,则输出 TIMESTAMP 将为 '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'

如果模板和输入在相同位置使用短划线作为分隔符(如上所述),则可以将破折号用作分隔符。由于模板省略了小时、分钟和秒,因此在输出 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: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';

-----而

----给定说明符 hh: mm: ss,早上输入字符串 '00:09:08' 的输出时间戳将包括 '00:09:08'

-----下午输入字符串 '12:09:08' 的输出时间戳将包括 '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

请注意,上面输入字符串中的字段是按照模板中说明符给定的顺序使用的,由模板和输入字符串 dashes-as-delimiters 中的定义:先是年,然后是小时,然后是分钟。由于模板中不存在月份和日期的说明符,因此它们在输入字符串中的值被忽略,输出 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” space-as-delimiter 之前有 a,而不是输入字符串的日期说明中使用的短划线分隔符;

而下面的四个模板之所以起作用,是因为它们使用相同的分隔符将年份说明符与输入字符串的日期规范中使用的下一个说明符分开(第一种情况为短划线,第二种情况为空格,第三种情况为斜杠,第四种情况为短划线)。

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

模板仅指定年份和月份,因此在生成的时间戳中省略了天/小时/分钟/秒:

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

使用'days'说明符接下来的三个成功了:

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 '的第四个元素是 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 '的第四个元素是 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

关于分隔符和值

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

通常,冒号用于将小时与分钟分开,将分钟与秒分开。同样,一般惯例是使用短划线或斜线将年与月分开,将月与日分开。任何parallel 用法似乎都有效,下面的例子说明了这一点。

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

上面的示例之所以成功,是因为分隔符是parallel 的(斜杠与斜杠,冒号与冒号),并且每个值对于相应的说明符来说都是可以接受的。

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

上面的示例之所以成功,是因为分隔符是parallel 的(全部是斜杠),并且每个值对于相应的说明符来说都是可以接受的。

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

上面的例子之所以成功,是因为分隔符是parallel 的,每个说明符的值都是可以接受的。

在以下示例中,请注意,所提供的字符串中的省略可能会导致模板值 “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

将时间戳转换为字符串

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-Literal 的字面意思是 “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)

这些限制同样适用于 Casting to TIME 或 DATE 类型。

字符串到时间

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

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

迄今为止的字符串

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

请注意,字符串的 CAST 要求用于转换为 TIME 或 DATE 的字符串操作数具有分别表示时间或日期所需的确切形式。

如下所示,在以下情况下强制转换失败:

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

  • INTERVAL 操作数('天时:分钟:秒.milseconds')不包含必需的数据,或

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

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

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

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

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

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

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

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

此示例之所以成功,是因为它包含了没有分数秒的正确表示秒数。

精确数字的间隔

间隔的 CAST 要求间隔操作数中只有一个字段,例如 “分钟”、“小时”、“秒”。

如果 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