Hive内置函数大全-03-日期时间函数-更新中

177 阅读10分钟

FROM_UNIXTIME(BIGINT unixtime[, STRING format])

  • 定义:from_unixtime(bigint unixtime[, string format])
  • 说明:传入一个精确到秒的时间戳,转为一个日期时间字符串,默认格式为yyyy-MM-dd HH:mm:ss,使用默认的时区(配置为hive.local.time.zone,这个配置的默认值为LOCAL,就是使用服务器本地的时区)
  • 返回值类型:string
  • 案例
SELECT FROM_UNIXTIME(1672295768);

+----------------------+
|         _c0          |
+----------------------+
| 2022-12-29 06:36:08  |
+----------------------+

SELECT FROM_UNIXTIME(1672295768, 'yyyy/MM/dd');

+-------------+
|     _c0     |
+-------------+
| 2022/12/29  |
+-------------+

DATE_FORMAT(DATE/TIMESTAMP/STRING ts, STRING fmt)

  • 定义:date_format(date/timestamp/string ts, string fmt)
  • 说明:传入一个日期时间,转化为指定的格式,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或者“yyyy-MM-dd”
  • 返回值类型:string
  • 可用版本:hive-1.2.0+
  • 案例
SELECT DATE_FORMAT("2022-01-01 00:00:00", "yyyy/MM/dd");

+-------------+
|     _c0     |
+-------------+
| 2022/01/01  |
+-------------+

SELECT DATE_FORMAT("2022-01-01", "yyyy.MM.dd");

+-------------+
|     _c0     |
+-------------+
| 2022.01.01  |
+-------------+

SELECT DATE_FORMAT("20220101", "yyyy.MM.dd");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

UNIX_TIMESTAMP()

  • 定义:unix_timestamp()
  • 说明:返回当前时间时间戳,单位是秒,从hive-2.0开始,此函数已经被标为废弃状态,推荐使用常量CURRENT_TIMESTAMP
  • 返回值类型:bigint
  • 案例
SELECT UNIX_TIMESTAMP();

+-------------+
|     _c0     |
+-------------+
| 1672295768  |
+-------------+

SELECT CURRENT_TIMESTAMP;

+--------------------------+
|           _c0            |
+--------------------------+
| 2022-12-29 14:37:17.166  |
+--------------------------+

UNIX_TIMESTAMP(STRING date)

  • 定义:unix_timestamp(string date)
  • 说明:传入一个格式为“yyyy-MM-dd HH:mm:ss”的字符串,转换为精确到秒的时间戳,如果转换失败,返回NULL
  • 返回值类型:bigint
  • 案例
SELECT UNIX_TIMESTAMP("2023-01-01 00:00:00");

+-------------+
|     _c0     |
+-------------+
| 1672531200  |
+-------------+

SELECT UNIX_TIMESTAMP("20230101");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

UNIX_TIMESTAMP(STRING date, STRING pattern)

  • 定义:unix_timestamp(string date, string pattern)
  • 说明:传入一个日期时间字符串及其格式,转换为精确到秒的时间戳,如果转换失败,返回NULL
  • 返回值类型:bigint
  • 案例
-- 不给时间,默认为 00:00:00
SELECT UNIX_TIMESTAMP("2023-01-01", "yyyy-MM-dd");

+-------------+
|     _c0     |
+-------------+
| 1672531200  |
+-------------+

SELECT UNIX_TIMESTAMP("20230101120000", 'yyyyMMddHHmmss');

+-------------+
|     _c0     |
+-------------+
| 1672574400  |
+-------------+

SELECT UNIX_TIMESTAMP("20230101120000", 'yyyy-MM-dd');

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

TO_DATE(STRING timestamp)

  • 定义:to_date(string timestamp)
  • 说明:传入一个日期时间字符串,返回其日期部分,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或者“yyyy-MM-dd”
  • 返回值类型:hive-2.1.0之前返回string,2.1.0+返回date
  • 案例
SELECT TO_DATE("2023-01-01 12:00:00");

+-------------+
|     _c0     |
+-------------+
| 2023-01-01  |
+-------------+

SELECT TO_DATE("2023-01-01");

+-------------+
|     _c0     |
+-------------+
| 2023-01-01  |
+-------------+

SELECT TO_DATE("20230101");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

YEAR(STRING date)

  • 定义:year(string date)
  • 说明:传入一个日期时间字符串,返回其年份部分,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:int
  • 案例
SELECT YEAR("2023-01-01 12:00:00");

+-------+
|  _c0  |
+-------+
| 2023  |
+-------+

SELECT YEAR("2023-01-01");

+-------+
|  _c0  |
+-------+
| 2023  |
+-------+

SELECT YEAR("20230101");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

QUARTER(DATE/TIMESTAMP/STRING)

  • 定义:quarter(date/timestamp/string)
  • 说明:传入一个日期时间字符串,返回其季度数字,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:int
  • 案例
SELECT QUARTER("2023-01-01 12:00:00");

+------+
| _c0  |
+------+
| 1    |
+------+

SELECT QUARTER("2023-04-01");

+------+
| _c0  |
+------+
| 2    |
+------+

SELECT QUARTER("20230701");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

MONTH(STRING date)

  • 定义:month(string date)
  • 说明:传入一个日期时间字符串,返回其月份数字,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:int
  • 案例
SELECT MONTH("2023-01-01 12:00:00");

+------+
| _c0  |
+------+
| 1    |
+------+

SELECT MONTH("2023-04-01");

+------+
| _c0  |
+------+
| 4    |
+------+

SELECT MONTH("20230701");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

DAY(STRING date)

  • 定义:day(string date)
  • 说明:传入一个日期时间字符串,返回其在月份中的数字(几号),传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:int
  • 案例
SELECT DAY("2023-01-01 12:00:00");

+------+
| _c0  |
+------+
| 1    |
+------+

SELECT DAY("2023-01-11");

+------+
| _c0  |
+------+
| 11   |
+------+

SELECT DAY("20230701");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

DAYOFMONTH(STRING date)

同DAY

HOUR(STRING date)

  • 定义:hour(string date)
  • 说明:传入一个日期时间字符串,返回其小时数,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:int
  • 案例
SELECT HOUR("2023-01-01 03:00:00");

+------+
| _c0  |
+------+
| 3    |
+------+

SELECT HOUR("2023-01-11");

+------+
| _c0  |
+------+
| 0    |
+------+

SELECT HOUR("18:00:00");
+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

SELECT HOUR("20230701");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

MINUTE(STRING date)

  • 定义:minute(string date)
  • 说明:传入一个日期时间字符串,返回其分钟数,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:int
  • 案例
SELECT MINUTE("2023-01-01 03:07:00");

+------+
| _c0  |
+------+
| 7    |
+------+

SELECT MINUTE("2023-01-11");

+------+
| _c0  |
+------+
| 0    |
+------+

SELECT MINUTE("18:37:00");
+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

SELECT MINUTE("20230701");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

SECOND(STRING date)

  • 定义:second(string date)
  • 说明:传入一个日期时间字符串,返回其秒数,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:int
  • 案例
SELECT SECOND("2023-01-01 03:07:04");

+------+
| _c0  |
+------+
| 4    |
+------+

SELECT SECOND("2023-01-11");

+------+
| _c0  |
+------+
| 0    |
+------+

SELECT SECOND("18:37:13");
+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

SELECT SECOND("20230701");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

WEEKOFYEAR(STRING date)

  • 定义:weekofyear(string date)
  • 说明:传入一个日期时间字符串,返回日期所在的周是当年的第几周,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 规则:每周从周一开始,每年的第一周至少包含4天
  • 返回值类型:int
  • 案例
SELECT WEEKOFYEAR("2023-01-01 03:07:04");

+------+
| _c0  |
+------+
| 52   |
+------+

SELECT WEEKOFYEAR("2022-01-01");

+------+
| _c0  |
+------+
| 52   |
+------+

SELECT WEEKOFYEAR("2021-01-01");

+------+
| _c0  |
+------+
| 53   |
+------+

SELECT WEEKOFYEAR("2020-01-01");

+------+
| _c0  |
+------+
| 1    |
+------+

SELECT WEEKOFYEAR("20220303");
+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

DATEDIFF

  • 定义:datediff(string enddate, string startdate)
  • 说明:计算startdate和enddate之间相差了几天,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:int
  • 案例
SELECT DATEDIFF("2023-01-02 03:07:04", "2023-01-01 15:00:00");

+------+
| _c0  |
+------+
| 1    |
+------+

SELECT DATEDIFF("2022-01-03", "2022-01-01");

+------+
| _c0  |
+------+
| 2    |
+------+

SELECT DATEDIFF("20220103", "20220101");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

DATE_ADD(DATE/TIMESTAMP/STRING startdate, TINYINT/SMALLINT/INT days)

  • 定义:date_add(date/timestamp/string startdate, tinyint/smallint/int days)
  • 说明:返回指定日期增加指定天数后的日期,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:hive-2.1.0之前返回string,2.1.0+返回date
  • 案例
SELECT DATE_ADD("2023-01-02 03:07:04", 2);

+-------------+
|     _c0     |
+-------------+
| 2023-01-04  |
+-------------+

SELECT DATE_ADD("2022-01-03", 3);

+-------------+
|     _c0     |
+-------------+
| 2022-01-06  |
+-------------+

SELECT DATE_ADD("20220103", 3);

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

DATE_SUB(DATE/TIMESTAMP/STRING startdate, TINYINT/SMALLINT/INT days)

  • 定义:date_sub(date/timestamp/string startdate, tinyint/smallint/int days)
  • 说明:返回指定日期减少指定天数后的日期,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:hive-2.1.0之前返回string,2.1.0+返回date
  • 案例
SELECT DATE_SUB("2023-01-02 03:07:04", 2);

+-------------+
|     _c0     |
+-------------+
| 2022-12-31  |
+-------------+

SELECT DATE_SUB("2022-01-03", 3);

+-------------+
|     _c0     |
+-------------+
| 2021-12-31  |
+-------------+

SELECT DATE_SUB("20220103", 3);

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

ADD_MONTHS(STRING start_date, INT num_months, STRING output_date_format)

  • 定义:add_months(string start_date, int num_months, string output_date_format)
  • 说明:返回指定日期增加指定月份后的日期,start_date是传入的日期,支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”,num_months是需要增加的月份数,output_date_format是输出的日期格式,可选,默认为“yyyy-MM-dd”
  • 返回值类型:string
  • 可用版本:hive-1.1.0+,官网说,可选的输出日期格式在hive-4.0.0+可用,但在hive-3.1.2版本中实测可用
  • 案例
SELECT ADD_MONTHS("2023-01-02 03:07:04", 2);

+-------------+
|     _c0     |
+-------------+
| 2023-03-02  |
+-------------+

SELECT ADD_MONTHS("2022-01-03", -3);

+-------------+
|     _c0     |
+-------------+
| 2021-10-03  |
+-------------+

SELECT ADD_MONTHS("2022-01-03", -3, "yyyy/MM/dd");

+-------------+
|     _c0     |
+-------------+
| 2021/10/03  |
+-------------+

SELECT ADD_MONTHS("20220103", 3);

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

MONTHS_BETWEEN(DATE/TIMESTAMP/STRING date1, DATE/TIMESTAMP/STRING date2)

  • 定义:months_between(date1, date2)
  • 说明:返回两个日期之间相差的月份数,如果date1 > date2,则返回正数,否则返回负数;如果两个日期是月份中的同一天,比如都是4号,或者都是最后一天,比如1月31号和4月30号,则结果是整数;否则结果是:先求两个日期之间相差的天数,然后除以31。传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”。
  • 返回值类型:小数位数为8的double
  • 可用版本:hive-1.2.0+
  • 案例
SELECT MONTHS_BETWEEN('2023-01-02 03:07:04', '2023-02-02');

+-------+
|  _c0  |
+-------+
| -1.0  |
+-------+

SELECT MONTHS_BETWEEN('2023-02-28', '2023-01-31');

+------+
| _c0  |
+------+
| 1.0  |
+------+

-- 1 / 31
SELECT MONTHS_BETWEEN("2022-01-04", "2022-01-03");

+-------------+
|     _c0     |
+-------------+
| 0.03225806  |
+-------------+

SELECT MONTHS_BETWEEN("20220103", "2022-01-02");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

LAST_DAY(STRING date)

  • 定义:last_day(string date)
  • 说明:返回指定的日期所在的月份的最后一天的日期,传入字符串支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”
  • 返回值类型:string
  • 可用版本:hive-1.1.0+
  • 案例
SELECT LAST_DAY("2023-01-02 03:07:04");

+-------------+
|     _c0     |
+-------------+
| 2023-01-31  |
+-------------+

SELECT LAST_DAY("2022-01-03");

+-------------+
|     _c0     |
+-------------+
| 2022-01-31  |
+-------------+

SELECT LAST_DAY("20220103");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

NEXT_DAY(STRING start_date, STRING day_of_week)

  • 定义:next_day(string start_date, string day_of_week)
  • 说明:返回在start_date之后的下一个day_of_week,比如next_day("2022-01-01", "FRIDAY"):返回2022-01-01之后的下一个星期五,day_of_week支持3种写法:2个字母的缩写、3个字母的缩写以及英文全拼,大小写不敏感,start_date支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”。
    • 2个字母的缩写:Mo、Tu、We、Th、Fr、Sa、Su
    • 3个字母的缩写:Mon、Tue、Wed、Thu、Fri、Sat、Sun
    • 英文全拼:Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday
  • 返回值类型:string
  • 可用版本:hive-1.2.0+
  • 案例
SELECT NEXT_DAY("2023-01-02 03:07:04", "Sunday");
-------------+
|     _c0     |
+-------------+
| 2023-01-08  |
+-------------+


SELECT NEXT_DAY("2023-01-02 03:07:04", "Sat");

+-------------+
|     _c0     |
+-------------+
| 2023-01-07  |
+-------------+

SELECT NEXT_DAY("2022-01-03", "We");

+-------------+
|     _c0     |
+-------------+
| 2022-01-05  |
+-------------+

SELECT NEXT_DAY("20220103", "We");

+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

TRUNC(STRING date, STRING format)

  • 定义:trunc(string date, string format)
  • 说明:返回日期被截断之后的日期,比如2022-01-05,从月份开始截断,则保留2022-01,day_of_month设置为01,返回2022-01-01;2022-03-05,从年份开始截断,则保留年份2022,月和日设置为01-01,返回2022-01-01;date支持的格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”;format支持的格式为MONTH/MON/MM和YEAR/YYYY/YY,大小写敏感。
  • 返回值类型:string
  • 可用版本:hive-1.2.0+
  • 案例
SELECT TRUNC("2023-03-05 03:07:04", "MONTH");
+-------------+
|     _c0     |
+-------------+
| 2023-03-01  |
+-------------+

SELECT TRUNC("2023-03-05 03:07:04", "Month");
+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

SELECT TRUNC("2023-03-05 03:07:04", "MON");
+-------------+
|     _c0     |
+-------------+
| 2023-03-01  |
+-------------+

SELECT TRUNC("2023-03-05 03:07:04", "MM");
+-------------+
|     _c0     |
+-------------+
| 2023-03-01  |
+-------------+


SELECT TRUNC("2023-03-05", "YYYY");
+-------------+
|     _c0     |
+-------------+
| 2023-01-01  |
+-------------+

SELECT TRUNC("2023-03-05", "YEAR");
+-------------+
|     _c0     |
+-------------+
| 2023-01-01  |
+-------------+

SELECT TRUNC("2023-03-05", "yy");
+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

SELECT TRUNC("20230305", "YEAR");
+-------+
|  _c0  |
+-------+
| NULL  |
+-------+

CURRENT_DATE

  • 常量:返回当前日期
  • 返回值类型:date
  • 可用版本:hive-1.2.0+
  • 案例:
SELECT CURRENT_DATE;

+-------------+
|     _c0     |
+-------------+
| 2023-01-16  |
+-------------+

CURRENT_TIMESTAMP

  • 常量:返回当前日期时间
  • 返回值类型:timestamp
  • 可用版本:hive-1.2.0+
  • 案例:
SELECT CURRENT_TIMESTAMP;

+-------------------------+
|           _c0           |
+-------------------------+
| 2023-01-16 11:23:54.35  |
+-------------------------+