日期和时间操作符

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_date
    • 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_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一年中第几个周信息。
    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位数字:000000~999000;解析1~9位数字: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,解析时间戳字符串