日期/时间表达式

Vertica 将内部启发式解析器用于全部日期/时间输入支持。日期和时间以字符串输入,通过初步确定字段中可能存在的信息种类,拆分为不同字段。每个字段均被解释并分配数值,或者被忽略或拒绝。解析器包含所有文本字段的内部查询表,包括月份、星期和时区。

Vertica 解析日期/时间类型输入内容如下:

  1. 将输入字符串拆分为标记,并将每个标记分类为字符串、时间、时区或数字。

  2. 数字标记包含:

    • 冒号 (:)- 解析为时间字符串,包括所有后续数字和冒号。

    • 破折号 (-)、斜杠 (/) 或者两个或更多的点 (.)- 解析为日期字符串,可能包含文本月份。

    • 仅数字 - 解析为单一字段或 ISO 8601 串联日期(19990113 表示 1999 年 1 月 13 日)或时间(141516 表示 14:15:16)。

  3. 以加号 (+) 或减号 (–) 作为开头的标记:解析为时区或特殊字段。

  4. 标记是文本字符串:与可能的字符串相匹配。

    • 使用二分搜索表查找标记,特殊字符串(例如今日)、星期(例如星期四)、月份(例如一月)或干扰词(例如 at、on)。

    • 设置字段的字段值和位掩码。例如,设置今日对应的年、月、日,还有当前的小时、分钟、秒钟。

    • 如果未找到,进行类似的二分搜索表查询,将标记与时区进行匹配。

    • 如果仍未找到,则会收到错误消息。

  5. 标记可以是一个数字或数字字段:

    • 如果是 8 位或 6 位数,且之前没有读取其他日期字段,则解释为“串联日期”(19990118 或 990118)。此解释为 YYYYMMDD YYMMDD

    • 如果标记是三位数,并且已经读取了年份,则解释为一年中的第几日。

    • 如果标记是四位或六位数,并且已经读取了年份,则解释为时间(HHMMHHMMSS)。

    • 如果是三位或更多位数,且未找到日期字段,则解释为年份(这样会强制剩余的日期字段按“年-月-日”的格式排序)。

    • 否则,假定日期字段排序遵循 DateStyle 设置:月-日-年、日-月-年或年-月-日。如果发现月份或日期字段超出范围,则会收到错误消息。

  6. 如果已指定 BC:忽略年份并添加一个用于内部存储。(在 Vertica 实施中,1 BC = 元年。)

  7. 如果未指定 BC,且年份字段是两位长度:将年份调整为四位数。如果字段小于 70,则添加 2000,否则添加 1900。

年月日排序

对于某些格式,年、月、日的日期输入排序不明确,可支持指定这些字段的预期排序。

特殊日期/时间值

为了方便起见,Vertica 支持数个特殊日期/时间值,如下所示。当用作 SQL 语句中的常数时,所有这些值在书写时都需要加单引号。

INFINITY-INFINITY 在系统中以特殊形式表示,并以相同方式显示。其他值为读取时转换为普通日期/时间值的简写符号。(尤其是,NOW 和相关字符串在读取后立即转换为特定时值。)

以下兼容 SQL 的函数也可用于获取相应数据类型的当前时间值。

后四个接受可选的精度要求。(请参阅日期/时间函数。)然而,这些函数是 SQL 函数,不能识别为数据输入字符串。