日期和时间操作符

Presto 支持两种日期时间操作符+-

示例:

--- +
date '2012-08-08' + interval '2' day	            --- 2012-08-10
time '01:00' + interval '3' hour	                --- 04:00:00.000
timestamp '2012-08-08 01:00' + interval '29' hour	--- 2012-08-09 06:00:00.000
timestamp '2012-10-31 01:00' + interval '1' month	--- 2012-11-30 01:00:00.000
interval '2' day + interval '3' hour	            --- 2 03:00:00.000
interval '3' year + interval '5' month	            --- 3-5
--- -
date '2012-08-08' - interval '2' day	            --- 2012-08-06
time '01:00' - interval '3' hour	                --- 22:00:00.000
timestamp '2012-08-08 01:00' - interval '29' hour	--- 2012-08-06 20:00:00.000
timestamp '2012-10-31 01:00' - interval '1' month	--- 2012-09-30 01:00:00.000
interval '2' day - interval '3' hour	            --- 1 21:00:00.000
interval '3' year - interval '5'                   --- month	2-7

时区转换

使用AT TIME ZONE操作符,可以实现时区转换。

示例:

SELECT timestamp '2012-10-31 01:00 UTC'; 
--- 2012-10-31 01:00:00.000 UTC
SELECT timestamp '2012-10-31 01:00 UTC' AT TIME ZONE 'America/Los_Angeles'; 
--- 2012-10-30 18:00:00.000 America/Los_Angeles

时间和日期函数

  • 基本函数
    函数 语法 说明
    current_date current_date -> date 返回当前(查询启动时)日期
    current_time current_time -> time with time zone 返回当前时间
    current_timestamp current_timestamp -> timestamp with time zone 返回当前时戳
    current_timezone current_timezone() → varchar 返回当前时区
    date date(x) → date 将日期字面量转换成日期类型的变量
    from_iso8601_timestamp from_iso8601_timestamp(string) → timestamp with time zone 将 ISO 8601 格式的时戳字面量转换成带时区的时戳变量
    from_iso8601_date from_iso8601_date(string) → date 将 ISO 8601 格式的日期字面量转换成日期类型的变量
    from_unixtime from_unixtime(unixtime, [timezone_str]) → timestamp 将UNIX时戳转换成时戳变量.可以带时区选项。
    from_unixtime from_unixtime(unixtime, hours, minutes) → timestamp with time zone 将 UNIX 时戳转换成带时区的时戳变量。hoursminutes表示时区偏移量。
    localtime localtime -> time 获取当前时间
    localtimestamp localtimestamp -> timestamp 获取当前时戳
    now now() → timestamp with time zone 获取当前时间,current_time的别名
    to_iso8601 to_iso8601(x) → varchar x转换成ISO8601格式的字符串。这里x可以是DATETIMESTAMP [with time zone]这几个类型.
    to_milliseconds to_milliseconds(interval) → bigint 获取当前距当天零时已经过去的毫秒数
    to_unixtime to_unixtime(timestamp) → double 将时间戳转换成 UNIX 时间
    注意

    使用下列 SQL 标准函数时,不用使用圆括号:

    • current_data
    • current_time
    • current_timestamp
    • localtime
    • localtimestamp
  • 截断函数

    截断函数将时间日期变量按给定的单位进行截取,返回该单位的时间日期值。使用方法如下:

    date_trunc(unit, x) -> [与 x 相同类型的变量]

    其中,unit可以选如下几个值:

    • second,截取到秒
    • minute,截取到分钟
    • hour,截取到小时
    • day,截取到天
    • week,截取到星期
    • month, 截取到月份
    • quarter, 截取到季度
    • year,截取到年
  • 时间间隔函数

    Presto 提供两个函数用于时间间隔计算,分别是:

    • date_add(unit, value, timestamp) → [same as input]

    计算给定增量的时间戳,增量可以为负,带单位。

    • date_diff(unit, timestamp1, timestamp2) → bigint

    计算两个时间戳的时间间隔,带单位。

    上面两个函数中,unit可以选如下几个值:

    • ns, 纳秒
    • us, 微秒
    • ms, 毫秒
    • s, 秒
    • m, 分
    • h, 小时
    • d, 天
  • 日期时间域提取函数

    Presto 提供了从一个日期变量中提取指定域的函数extract,具体如下:

    extract(field FROM x) → bigint

    其中,x为要提取的日期时间变量,field为要提取的域,可取如下列表中的值:

    • YEAR, 年
    • QUARTER,季度
    • MONTH, 季度
    • WEEK, 星期
    • DAY, 天
    • DAY_OF_MONTH, 一个月中的第几天
    • DAY_OF_WEEK,一星期中的第几天
    • DOW, 同DAY_OF_WEEK
    • DAY_OF_YEAR, 一年中的第几天
    • DOY, 同DAY_OF_YEAR
    • YEAR_OF_WEEKISO Week中的年份
    • YOW, 同YEAR_OF_WEEK
    • HOUR, 小时
    • MINUTE,分钟
    • SECOND, 秒
    • TIMEZONE_HOUR, 小时,带时区
    • TIMEZONE_MINUTE,分钟,带时区

    为了方便使用,Presto 提供了如下辅助函数:

    函数 语法 说明
    day day(x) → bigint 返回当前日期是一个月中的第几天
    day_of_month day_of_month(x) → bigint day
    day_of_week day_of_week(x) → bigint 返回当前日期是一天中的第几天
    day_of_year day_of_year(x) → bigint 返回当前时间是一年中的第几天
    dow dow(x) → bigint day_of_week
    doy doy(x) → bigint day_of_year
    hour hour(x) → bigint 返回给定时间的小时数,取值范围为[0, 23]
    minute minute(x) → bigint 返回给定时间的分钟数,取之范围为[0, 59]
    month month(x) → bigint 返回给定时间的月份,取值范围为[1, 12]
    quarter quarter(x) → bigint 返回给定时间所属的季度
    second second(x) → bigint 返回给定时间的秒数,取之范围为[0, 59]
    timezone_hour timezone_hour(timestamp) → bigint 返回时区偏移量,单位小时
    timezone_minute timezone_minute(timestamp) → bigint 返回时区偏移量,单位分钟
    week week(x) → bigint 返回一年中的第几个信息,取值范围[1, 53]
    week_of_year week_of_year(x) → bigint week
    year year(x) → bigint 返回给定时间的年份值
    year_of_week year_of_week(x) → bigint 返回x(ISO Week格式)中的年份
    yow yow(x) → bigint year_of_week
  • MySQL 日期函数

    Presto 提供了两个日期解析相关的函数,用于兼容 MySQL 的日期函数date_parsestr_to_date,它们分别是:

    • date_format(timestamp, format) → varchar

      使用format格式化timestamp

    • date_parse(string, format) → timestamp

      format格式解析日期字面量。

    Presto 支持的 MySQL 格式符号如下表所示:

    符号 说明
    %a 星期简写 (Sun .. Sat)
    %b 月份简写 (Jan .. Dec)
    %c 月份,数字(1 .. 12),不可以为0
    %d 月中天数,数字(01 .. 31),不可以为0
    %e 月中天数,数字 (1 .. 31),不可以为0
    %f 秒数 (6 digits for printing: 000000 .. 999000; 1 - 9 digits for parsing: 0 .. 999999999)
    %H 小时 (00 .. 23)
    %h 小时 (01 .. 12)
    %I 小时 (01 .. 12)
    %i 分钟 (00 .. 59)
    %j 一年中的第几天 (001 .. 366)
    %k 小时 (0 .. 23)
    %l 小时 (1 .. 12)
    %M 月份名称 (January .. December)
    %m 月份,数字 (01 .. 12) [4]
    %p AM / PM
    %r 时间, 12小时 (hh:mm:ss AM/PM)
    %S 秒 (00 .. 59)
    %s 秒 (00 .. 59)
    %T 时间, 24hour (hh:mm:ss)
    %v 星期 (01 .. 53), 第一条为星期一,与%X配合使用
    %W 星期名称 (Sunday .. Saturday)
    %x 年份,数字,4位,第一天为星期一
    %Y 年份,数字,4位
    %y 年份,数字,2位, 表示年份范围为[1970, 2069]
    %% 表示字符'%'
    说明 Presto 目前不支持的符号有: %D %U %u %V %w %X
  • Java 日期函数

    下列函数用于兼容 Java 的日期格式(JodaTime Pattern).

    • format_datetime(timestamp, format) → varchar,格式化时间戳
    • parse_datetime(string, format) → timestamp with time zone,解析时间戳字符串