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

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

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

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

操作符 描述 备注

+

间隔 + 间隔 = 间隔

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

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

-

间隔-间隔 = 间隔

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

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

*

间隔 * 数字 = 间隔

数字 * 间隔 = 间隔

/

间隔/数字 = 间隔

Examples

示例 操作 结果

1

间隔 '1' 天 + 间隔 '3' 天

间隔 '4' 天

2

间隔 '1' 天 + 间隔 '3 4' 一天到小时

间隔 '+4 04' 一天到小时

3

间隔 '1' 天-间隔 '3 4' 从天到小时

间隔 '-2 04' 一天到小时

4

间隔 '1' 年 + 间隔 '3-4' 年到月

间隔 “+4-04” 年到月

5

2 * 间隔 “3 4” 一天到小时

间隔 “6 8” 一天到小时

6

间隔 '3 4' 一天到小时/2

间隔 '1 14' 一天到小时

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

示例 4 使用 “至月” 而不是 “至小时”,因此指定为 “3-4” 的时间间隔表示 3 年零 4 个月或 40 个月。

在示例 6 中,“/2" 适用于间隔 '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-不支持(简单日期差异)

如果您不指定 “day” 作为预期单位,如下所示,则不支持减法。

    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>'

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

<expression>在上述示例中使用 “values cast (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 的情况下显示结果:

指定间隔的规则

日间间隔文字是表示单个间隔值的字符串:例如 “10” 秒。请注意,它有两个部分:值(必须始终在单引号中)和限定符(此处为 SEECT),它们给出了值的单位。

限定符采用以下形式:

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

“年到月” 间隔需要用短划线来分隔值,而 “从日到小时” 间隔使用空格来分隔这些值,如该主题的第 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 转换为 “X 到最接近的 Y”。因此,日到小时是 “天到最近的小时”。

当 DAY、小时或分钟是前导项时,您可以指定精度,例如 DAY (3) 至小时,指示值中关联字段可以具有的位数。最大精度为 10,默认值为 2。您不能在尾随项中指定 “小时” 或 “分钟” 的精度-它们始终是精度 2。因此,例如,小时(3)到分钟是合法的,小时到分钟(3)不是。

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

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

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

至于值,它采用以下一般形式:

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

其中 DD 是指示天数的数字,HH 小时,MM 分钟,SS.SSS 是秒(如果明确指定了精度,则适当调整位数)。

并非所有值都必须包含所有字段-您可修剪前后部分,但不能修剪中间部分。所以你可以把它变成 “DD 硬盘” 或 “MM:SSS”,但不是 “DD MM”。

但是,不过您编写它,该值必须与限定符匹配,如下所示:

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

如 SQL 规范中所述,如果未明确指定精度,则隐含为 2。因此:

  • 间隔 '120' 分钟是非法的时间间隔。所需时间间隔的法定形式是间隔 '120' 分钟 (2)

  • 间隔 '120' 秒是不合法的。所需时间间隔的法定形式是间隔 '120' 秒 (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

此外,如果 “小时”、“分钟” 或 “秒” 不是前导字段,则它们必须在以下范围内(取自 SQL:2008 基础规范主题 4.6.3 中的表 6),如下所示:

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

年月间隔类似,只是限定词如下所示:

 YEAR  MONTH  YEAR TO MONTH

精度可以与日和小时一样指定,最大值为 10,默认值 2 相同。

年月的值格式为:“是-毫米” 如果月是尾随字段,则它必须在 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>