Contents

Spark, Hive QL-日期函数汇总


分场景汇总日期函数

工作中总会遇到处理时间的问题,参考营销理论中基于利益细分的市场细分理论,我从使用场景的角度出发,将常用的日期函数分为四大类:

  • 时间计算
  • 时间提取
  • 格式转换
  • 当前时间

https://i.loli.net/2021/05/31/pjrM6VtP2EF9gHY.png

本文重点在于整合日期函数

时间计算

这部分主要是计算时间差(datediff(end_date,start_date), months_between(date1,date2))、时间加减(date_add(),date_sub(),add_months())等

时间提取

提取时间戳的年、季度、月、周、日、小时、分钟、秒

可以直接调用对应的函数,也可使用extract(field from column_name) 函数指定 field,其中field 支持day, dayofweek, hour, minute, month, quarter, second, week and year.

格式转换

有时为了适应不同时间格式的需求,需要做个转换,如yyyy-MM-ddyyyy-MM-dd HH:mm:ss的形式转为yyyyMMdd

常用:

  • to_date()

    返回 date 形式的日期,即yyyy-MM-dd

  • date_format()

    转为指定格式的时间,如 date_format('2015-04-08','y') => '2015'

当前时间

若需要时间戳格式,则用current_timestamp

若只需要精确到天,即date格式,则用current_date

总结

本文重点在于从使用场景的角度出发,整合了hive, spark 环境下常用的日期函数。最后再以表格的形式简单汇总

场景 函数 返回值类型 描述 示例
当前时间 unix_timestamp() bigint 当前 Unix时间戳(e.g. 1622451519 ),但因查询优化问题推荐使用 current_timestamp
当前时间 current_date date 当前日期 2021-05-31
当前时间 current_timestamp timestamp 当前时间戳 2021-05-31 17:12:14.968
- - - - -
格式转换 from_unixtime(bigint unixtime[, string format]) string 数字转为格式形如 2021-05-31 17:12:14 的字符串
格式转换 to_date(string timestamp) date to_date(yyyy-MM-dd HH:mm:ss) => yyyy-MM-dd
格式转换 date_format(date/timestamp/string ts, string fmt) string 得到指定格式的时间 date_format(‘2015-04-08’, ‘y’) => ‘2015’
格式转换 trunc(string date, string format) string 得到被指定format截断的日期,format支持MONTH/MON/MM, YEAR/YYYY/YY trunc(‘2015-03-17’, ‘MM’) => 2015-03-01
- - - - -
时间提取 year(string date) int
时间提取 quarter(date/timestamp/string) int 季度
时间提取 weekofyear(string date) int 该年的第几周
时间提取 month(string date) int
时间提取 day(string date) dayofmonth(date) int
时间提取 hour(string date) int 小时
时间提取 minute(string date) int 分钟
时间提取 second(string date) int
时间提取 extract(field FROM source) int field 支持day, dayofweek, hour, minute, month, quarter, second, week and year.
- - - - -
时间计算 datediff(string enddate, string startdate) int 天数差 datediff(‘2009-03-01’, ‘2009-02-27’) => 2
时间计算 date_add(date/timestamp/string startdate, tinyint/smallint/int days) date 加(减)x天后的日期 date_add(‘2008-12-31’, 1) => 2009-01-01, date_add(‘2008-12-31’, -1) => 2008-12-30
时间计算 date_sub(date/timestamp/string startdate, tinyint/smallint/int days) date 加(减)x天后的日期 date_sub(‘2008-12-31’, 1) => 2008-12-30, date_sub(‘2008-12-31’, -1) => 2009-01-01
时间计算 add_months(string start_date, int num_months, output_date_format) string x月后。如果start_date是该月的最后一天 或者 x月后的天数不是“大月”则结果为x月后该月的最后一天 add_months(‘2017-12-31 14:15:16’, 2, ‘YYYY-MM-dd HH:mm:ss’) => ‘2018-02-28 14:15:16’
时间计算 last_day(string date) string 该月最后一天的日期 last_day(2021-05-11) => ‘2021-05-31’
时间计算 next_day(string start_date, string day_of_week) string 返回大于 start_date 的日期中最近的一个周x next_day(‘2021-05-31’,‘Monday’)
时间计算 months_between(date1, date2) double date1-date2 月数差 months_between(‘1997-02-28 10:30:00’, ‘1996-10-30’) => 3.94959677