本文介绍日期时间函数的语法规则,包括参数解释和函数示例等。

日期和时间操作符

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操作符,设置一个时间戳的时区。

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 以IANA(例如,America或Los_Angeles)定义的格式返回当前时区,或以UTC的固定偏移量(例如+08:35)返回当前时区。
    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) → timestamp 返回unixtime时间戳。
    from_unixtime(unixtime, string) → timestamp with time zone 返回指定时区的unixtime时间戳。
    from_unixtime(unixtime, hours, minutes) → timestamp with time zone 返回为hours和minutes对应时区的unixtime时间戳
    localtime localtime -> time 返回查询开始时的当前时间。
    localtimestamp localtimestamp -> timestamp 返回查询开始时的当前时间戳。
    now now() -> timestamp with time zone 这是current_timestam的另一种表达。
    to_iso8601 to_iso8601(x) -> varchar 将x格式化为ISO 8601字符串。x可以是date、timestamp或带时区的timestamp。
    to_milliseconds to_milliseconds(interval) -> bigint 获取当前距当天零时已经过去的毫秒数。
    to_unixtime to_unixtime(timestamp) -> double 将时间戳转换成UNIX时间。
  • 截取函数
    截取函数将时间日期变量按给定的单位进行截取,返回该单位的时间日期值。使用方法如下。
    单位 示例
    second 2001-08-22 03:04:05.000
    minute 2001-08-22 03:04:00.000
    hour 2001-08-22 03:00:00.000
    day 2001-08-22 00:00:00.000
    week 2001-08-20 00:00:00.000
    month 2001-08-01 00:00:00.000
    quarter 2001-07-01 00:00:00.000
    year 2001-01-01 00:00:00.000
  • 间隔函数
    本文介绍如下两个间隔函数:
    • date_add(unit, value, timestamp) → [same as input]

      在timestamp的基础上加上value个unit。如果想要执行相减的操作,可以通过将value赋值为负数来完成。

    • date_diff(unit, timestamp1, timestamp2) → bigint

      返回timestamp2 - timestamp1之后的值,该值的表示单位是unit。

    间隔函数支持如下所示单位。
    单位 描述
    millisecond Milliseconds
    second Seconds
    minute Minutes
    hour Hours
    day Days
    week Weeks
    month Months
    quarter Quarters of a year
    year Years
  • 抽取函数

    抽取函数支持的数据类型取决于需要抽取的域。大多数域都支持日期和时间类型。

    extract(field FROM x) → bigint

    其中,x为要提取的日期时间变量,field为要提取的域。
    描述
    YEAR year()
    QUARTER quarter()
    MONTH month()
    WEEK week()
    DAY day()
    DAY_OF_MONTH day()
    DAY_OF_WEEK day_of_week()
    DOW day_of_week()
    DAY_OF_YEAR day_of_year()
    DOY day_of_year()
    YEAR_OF_WEEK year_of_week()
    YOW year_of_week()
    HOUR hour()
    MINUTE minute()
    SECOND second()
    TIMEZONE_HOUR timezone_hour()
    TIMEZONE_MINUTE timezone_minute()
  • 便利的抽取函数
    语法 说明
    day(x) -> bigint 返回指定日期在当月的天数。
    day_of_month(x) -> bigint day()的另一种表达。
    day_of_week(x) -> bigint 返回指定日期对应的星期值,取值范围1~7。
    day_of_year(x) -> bigint 返回指定日期对应一年中的第几天,取值范围1~366。
    dow(x) -> bigint day_of_week()的另一种表达。
    doy(x) -> bigint day_of_year()的另一种表达。
    hour(x) -> bigint 返回指定日期对应的小时,取值范围为0~23。
    minute(x) -> bigint 返回指定日期对应的分钟数。
    month(x) -> bigint 返回指定日期对应的月份。
    quarter(x) -> bigint 返回指定日期对应的季度。
    second(x) -> bigint 返回指定日期对应的秒数。
    timezone_hour(timestamp) -> bigint 返回从指定时间戳对应时区偏移的小时数。
    timezone_minute(timestamp) -> bigint 返回从指定时间戳对应时区偏移的分钟数。
    week(x) -> bigint 返回指定日期对应一年中的ISO week,取值范围1~53。
    week_of_year(x) -> bigint week()的另一种表达。
    year(x) -> bigint 返回指定日期对应的年份。
    year_of_week(x) -> bigint 返回指定日期对应的ISO week的年份。
    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)。
    %d 月中天数,数字(1~31)。
    %e 月中天数,数字 (1~31)。
    %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)。
    %p AM或PM。
    %r 时间,12小时 (hh:mm:ss AM/PM)。
    %S 秒(00~59)。
    %s 秒 (00~59)。
    %T 时间,24小时 (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,解析时间戳字符串。