日期、时间戳和时间间隔运算符 - Amazon Kinesis Data Analytics
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

日期、时间戳和时间间隔运算符

算术运算符 +、-、* 和 / 是二元运算符。

运算符 描述 备注

+

时间间隔 + 时间间隔 = 时间间隔

时间间隔 + 日期时间 = 日期时间

日期时间 + 时间间隔 = 日期时间

-

时间间隔 - 时间间隔 = 时间间隔

日期时间 - 时间间隔 = 日期时间

( <datetime> - <datetime> ) 日期、时间戳和时间间隔运算符 <interval qualifier> = 时间间隔

*

时间间隔 * 数字 = 时间间隔

数字 * 时间间隔 = 时间间隔

/

时间间隔 / 数字 = 时间间隔

示例

示例 操作 结果

1

INTERVAL '1' DAY + INTERVAL '3' DAY

INTERVAL '4' DAY

2

INTERVAL '1' DAY + INTERVAL '3 4' DAY TO HOUR

INTERVAL '+4 04' DAY TO HOUR

3

INTERVAL '1' DAY - INTERVAL '3 4' DAY TO HOUR

INTERVAL '-2 04' DAY TO HOUR

4

INTERVAL '1' YEAR + INTERVAL '3-4' YEAR TO MONTH

INTERVAL '+4-04' YEAR TO MONTH

5

2 * INTERVAL '3 4' DAY TO HOUR

INTERVAL '6 8' DAY TO HOUR

6

INTERVAL '3 4' DAY TO HOUR / 2

INTERVAL ' 1 14' DAY TO HOUR

在示例 3 中,'3 4 DAY 意味着 3 天 4 小时,因此该行中的结果意味着 24 小时减去 76 小时,结果为负 52 小时,即负 2 天 4 小时。

示例 4 使用 TO MONTH 而不是 TO HOUR,因此指定为 '3-4' 的 INTERVAL 意味着 3 年 4 个月或 40 个月。

在示例 6 中,“/2”适用于 INTERVAL '3 4' (76 小时),其一半为 38 小时 (或 1 天 14 小时)。

更多时间间隔运算示例

流式 SQL 也支持在提供时间间隔的前提下减两个日期时间。您指定希望结果为哪种时间间隔,如下所示:

(<datetime> - <datetime>) <interval qualifier>

下列示例说明可在 Amazon Kinesis Data Analytics 应用程序中使用的运算。

例 1 – 时间差(以精确到秒的分钟或秒表示)

values cast ((time  '12:03:34' - time '11:57:23') minute to second as varchar(8)); +---------+ EXPR$0   +---------+ +6:11   +---------+ 1 row selected ............... 6 minutes, 11 seconds or values cast ((time  '12:03:34' - time '11:57:23') second as varchar(8)); +---------+ EXPR$0   +---------+ +371     +---------+ 1 row selected

例 2 – 时间差(仅以分钟表示)

values cast ((time  '12:03:34' - time '11:57:23') minute as varchar(8)); +---------+ EXPR$0   +---------+ +6       +---------+ 1 row selected ............... 6 minutes; seconds ignored. values cast ((time  '12:03:23' - time '11:57:23') minute as varchar(8)); +---------+ EXPR$0   +---------+ +6       +---------+ 1 row selected ............... 6 minutes

例 3 – 时间到时间戳差异(以精确到秒的天表示)无效

values cast ((time '12:03:34'-timestamp '2004-04-29 11:57:23') day to second as varchar(8)); Error: From line 1, column 14 to line 1, column 79: Parameters must be of the same type

例 4 – 时间戳差异(以精确到秒的天表示)

values cast ((timestamp  '2004-05-01 12:03:34' - timestamp '2004-04-29 11:57:23') day to                second as varchar(8)); +-----------+  EXPR$0   +-----------+ +2 00:06   +-----------+ 1 row selected ............... 2 days, 6 minutes ............... Although "second" was specified above, the varchar(8) happens to allow only room enough to show only the minutes, not the seconds. The example below expands to varchar(11), showing the full result: values cast ((timestamp  '2004-05-01 12:03:34' - timestamp '2004-04-29 11:57:23') day to                second as varchar(11)); +--------------+    EXPR$0     +--------------+ +2 00:06:11   +--------------+ 1 row selected ............... 2 days, 6 minutes, 11 seconds

例 5 – 时间戳差异(以精确到秒的天表示)

values cast ((timestamp  '2004-05-01 1:03:34' - timestamp '2004-04-29 11:57:23') day to                second as varchar(11)); +--------------+    EXPR$0     +--------------+ +1 13:06:11   +--------------+ 1 row selected ............... 1 day, 13 hours, 6 minutes, 11 seconds values cast ((timestamp  '2004-05-01 13:03:34' - timestamp '2004-04-29 11:57:23') day to                second as varchar(11)); +--------------+    EXPR$0     +--------------+ +2 01:06:11   +--------------+ 1 row selected ............... 2 days, 1 hour, 6 minutes, 11 seconds

例 6 – 时间戳差异(以天表示)

values cast ((timestamp  '2004-05-01 12:03:34' - timestamp '2004-04-29 11:57:23') day                as varchar(8)); +---------+ EXPR$0   +---------+ +2       +---------+ 1 row selected ............... 2 days

例 7 – 时间差异(以天表示)

values cast ((date '2004-12-02 ' - date '2003-12-01 ') day  as varchar(8)); Error: Illegal DATE literal '2004-12-02 ': not in format 'yyyy-MM-dd' .............. Both date literals end with a space;  disallowed. values cast ((date '2004-12-02' - date '2003-12-01 ') day  as varchar(8)); Error: Illegal DATE literal '2003-12-01 ': not in format 'yyyy-MM-dd' .............. Second date literal still ends with a space;  disallowed. values cast ((date '2004-12-02' - date '2003-12-01') day  as varchar(8)); +---------+ EXPR$0   +---------+ +367     +---------+ 1 row selected ............... 367 days

例 8 – 不支持(简单日期差异)

如果您未指定“天”作为计划单位 (如下所示),则不支持减法。

    values cast ((date '2004-12-02' - date '2003-12-01') as varchar(8));     Error: From line 1, column 15 to line 1, column 51:            Cannot apply '-' to arguments of type '<DATE> - <DATE>'.     Supported form(s): '<NUMERIC> - <NUMERIC>'                        '<DATETIME_INTERVAL> - <DATETIME_INTERVAL>'                        '<DATETIME> - <DATETIME_INTERVAL>'

为什么在转换示例中使用“as varchar”?

在上述示例中使用“values cast (<expression> AS varchar(N))”语法的原因是,虽然上面使用的 SQLline 客户端(运行了 Amazon Kinesis Data Analytics)返回时间间隔,但 JDBC 不支持返回结果,因此是为了显示结果。因此,“值”语法用于查看/显示结果。

如果您关闭 Amazon Kinesis Data Analytics(使用 !kill 命令)或在运行 SQLline 之前未启动它,则可从 Amazon Kinesis Data Analytics 主目录的 bin 子目录运行 sqllineEngine(而不是 sqllineClient),这可在没有 Amazon Kinesis Data Analytics 应用程序或 JDBC 的情况下显示结果:

用于指定时间间隔的规则

Day-Time Interval Literal 是表示单个时间间隔值的字符串:例如 '10' SECONDS。请注意,它具有两个部分:值 (必须始终位于单引号中) 和限定符 (这里是,SECONDS),它为值指定单位。

限定符采用以下格式:

DAY  HOUR  MINUTE  SECOND [TO HOUR  MINUTE  SECOND]
注意

YEAR TO MONTH 时间间隔需要短横线来分隔值,而 DAY TO HOUR 时间间隔使用空格来分隔值,如相应主题的第 2 个、第 3 个、第 5 个和第 6 个示例中所示。

此外,前导词的意义必须比尾部词更重要,因此这意味着您只能指定:

 DAY  HOUR  MINUTE  SECOND  DAY TO HOUR  DAY TO MINUTE  DAY TO SECOND  HOUR TO MINUTE  HOUR TO SECOND  MINUTE TO SECOND

理解它们的最轻松方式是将 X TO Y 转换为“精确到 Y 的 X”。因此,DAY TO HOUR 为“精确到小时的天”。

当 DAY、HOUR 或 MINUTE 为前导词时,您可指定精度,例如 DAY(3) TO HOUR,指示值中的关联字段可包含的位数。最大精度为 10,默认精度为 2。您无法为尾部词中的 HOUR 或 MINUTE 指定精度 - 它们始终具有精度 2。例如,HOUR(3) TO MINUTE 是合法的,HOUR TO MINUTE(3) 是非法的。

SECOND 也可采用精度,但指定方式不同,取决于它是前导还是尾随字段。

  • 如果 SECOND 是前导字段,则可在小数点前后指定位数。例如,SECOND(3,3) 将允许您指定最多 999.999 秒。默认值为 (2,3),此值实际上是 SQL:2008 规范 (它应该是 (2,6),但我们仅具有毫秒精度) 的偏差。

  • 如果 SECOND 是尾随字段,您只能为小数秒 (即,秒的小数点后显示的部分) 指定精度。例如,SECOND(3) 表示毫秒。默认值为小数点后的 3 位,但如上所示,这是标准 6 的偏差。

对于此值,它采用一般格式:

 [+-]'[+-]DD HH:MM:SS.SSS'

其中,DD 为表示天的数字、HH 为表示小时的数字、MM 为表示分钟的数字,而 SS.SSS 为秒 (如果已显式指定精度,则相应地调整位数)。

并非所有值都必须包含所有字段 — 您可修剪前后部分,但不能修剪中间部分。因此,您可修剪为 'DD HH' 或 'MM:SS.SSS',但不能修剪为 'DD MM'。

不过,虽然值由您编写,但值必须与限定符匹配,如下所示:

INTERVAL '25 3' DAY to HOUR ------> legal INTERVAL '3:45:04.0' DAY TO HOUR --> illegal

依据 SQL 规范,如果未显式指定精度,则暗指 2。因此:

  • INTERVAL '120' MINUTE 是非法时间间隔。所需时间间隔的合法格式为 INTERVAL '120' MINUTE(2)

  • INTERVAL '120' SECOND 是不合法的。所需时间间隔的合法格式为 INTERVAL '120' SECOND(3)。

      values INTERVAL '120' MINUTE(2);   Error: From line 1, column 8 to line 1, column 31:                       Interval field value 120 exceeds precision of MINUTE(2) field   values INTERVAL '120' MINUTE(3);   Conversion not supported

此外,如果 HOUR、MINUTE 或 SECOND 都不是前导字段,它们必须位于下列范围内 (取自 SQL:2008 基础规范的主题 4.6.3 中的表 6),如下所示:

 HOUR: 0-23  MINUTE: 0-59  SECOND: 0-59.999

年-月时间间隔类似 (限定符除外),如下所示:

 YEAR  MONTH  YEAR TO MONTH

只能使用 DAY 和 HOUR 指定精度,最大精度 10 和默认精度 2 相同。

年-月的值格式为:“YY-MM”。如果 MONTH 是尾随字段,则它必须位于 0-11 范围内。

<interval qualifier> := <start field> TO <end field>  <single datetime field> <start field> := <non-second primary datetime field> [ <left paren> <interval leading field precision> <right paren> ] <end field> := <non-second primary datetime field>  SECOND [ <left paren> <interval fractional seconds precision> <right paren> ] <single datetime field> := <non-second primary datetime field> [ <left paren> <interval leading field precision> <right paren> ]   SECOND [ <left paren> <interval leading field precision>           [ <comma> <interval fractional seconds precision> ] <right paren> ] <primary datetime field> := <non-second primary datetime field>       SECOND <non-second primary datetime field> := YEAR  MONTH  DAY  HOUR      MINUTE <interval fractional seconds precision> := <unsigned integer> <interval leading field precision> := <unsigned integer>