1、日期函数
当前系统时间
sql
-- 当前系统日期 格式:"yyyy-MM-dd"
select current_date();
-- 当前系统时间:格式:"yyyy-MM-dd HH:mm:ss.ms"
select current_timestamp();
--当前系统时间戳 格式:距离1970年1月1日0点的秒数
select unix_timestamp();
日期转时间戳
sql
--2020-01-21 08:00:00 距离1970年1月1日0点的秒数
select unix_timestamp('2020-01-21 08:00:00');
--2020-01-21 距离1970年1月1日0点的秒数
select unix_timestamp('2020-01-21','yyyy-MM-dd');
--2020/01/21 距离1970年1月1日0点的秒数
select unix_timestamp('2020/01/21','yyyy/MM/dd');
时间戳转日期
sql
--根据时间戳转日期 (默认格式 yyyy-MM-dd HH~mm~ss)
select from_unixtime(1579622400);
--根据时间戳转日期,指定输出格式:
select from_unixtime(1693046606,'yyyy/MM/dd HH~mm~ss');
unix_timestamp 函数是将一个字符串,变为了一个时间戳
from_unixtime 函数是将时间戳变为了一个字符串
日期时间分量
sql
select year(current_timestamp()),
month(current_timestamp()),
day(current_timestamp()),
hour(current_timestamp()),
minute(current_timestamp()),
second(current_timestamp())

日期加减函数
sql
-- 计算两个日期相差的天数 59
select datediff('2025-03-01','2025-01-01');
-- 计算两个日期相差的月数 2
select months_between('2025-03-01','2025-01-01');
-- 加天数 2025-01-04
select date_add('2025-01-01',3);
-- 减天数 2024-12-29
select date_sub('2025-01-01',3);
--加月份 2025-04-01
select add_months('2025-01-01',3);
--减月份 2024-10-01
select add_months('2025-01-01',-3);
计算时间差函数
sql
-- 计算日期相差的天数:31
select datediff('2025-02-01','2025-01-01');
--计算日期相差的月数: 1
select months_between('2025-02-01','2025-01-01');
日期定位函数
sql
--月末:
select last_day(current_date());
--可以求出当前日期的下个星期几
select next_day(current_date(),'thursday');
字符串转日期
sql
select to_date('2023-07-01');
将日期转为字符串
sql
select date_format(current_timestamp(),'yyyy-MM-dd');
select date_format(current_timestamp(),'yyyy-MM-dd HH:mm:ss');
select date_format('2017-01-01','yyyy-MM-dd HH:mm:ss');
2、字符串函数
sql
--转大写: ABC
select upper('abc');
-- 转小写: abc
select lower('ABC');
--字符串长度: 3
select length('abc');
-- 字符串拼接: ABC
select concat('AB', 'C');
-- 字符串截取: cde
select substr('abcde',3);
-- 字符串拼接,指定分隔符: A-B-C
select concat_ws('-','A' ,'B','C');
-- 字符串分割,指定分隔符:返回数组["a","b","c","d","e","f"]
select split("a-b-c-d-e-f","-");
--分割后在拼接:a&b&c&d&f
select concat_ws('&',split('a,b,c,d,f',','));
--替换分隔符:a&b&c&d&f
select replace('a,b,c,d,f',',','&');
3、类型转换函数
sql
-- string转int
select cast('123' as int);
-- int转string
select cast(123 as string);
4、数学函数
sql
--round 四舍五入:42
select round(42.3);
--ceil 向上取整:43
select ceil(42.3);
--floor 向下取整:42
select floor(42.3);
-- 求绝对值:1
select abs(-1);
--取模函数:1
select pmod(3,2);
5、Hive 其他函数
nvl
sql
--如果为null,给一个默认值
select nvl(null,100);
case when then ....when ...then.. else... end
准备数据如下:
sql
张三 A 男
李四 A 男
王五 B 男
赵六 A 女
琪琪 B 女
巴巴 B 女
建表
sql
create table emp_sex(
name string,
dept_id string,
sex string
)
row format delimited fields terminated by "\t";
导入数据:
sql
load data local inpath '/home/hivedata/test_a.txt'
into table emp_sex;
统计男女人数
sql
select sex,count(1)
from emp_sex group by sex;

sql
还有其他写法:
select
sum(case when sex='男' then 1 else 0 end) as `男`,
sum(case when sex='女' then 1 else 0 end) as `女`
from emp_sex;
还可以使用类似于switch的写法:
select
sum(case sex when '男' then 1 else 0 end) as man ,
sum(case sex when '女' then 1 else 0 end) as women
from emp_sex;

hive中的字段的别名,英文别名不要使用单引号或者双引号,直接写就行,如果是中文的别名需要添加反引号``
if(p1,p2,p3)
sql
--如果为true,则取第一个值,否则取第二个值
select if(1==1,1,2);
拓展:以下三个一个效果
select if(comm is null,0,comm) from emp;
select nvl(comm,0) from emp;
select case when comm is null then 0 else comm end from emp;
get_json_object
sql
--从json数据中获取值:19
select get_json_object('{"name":"jack","age":19}','$.age');
parse_url
sql
--获取url中的HOST: www.baidu.com
select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','HOST');
-- 获取PROTOCOL中的协议: http
select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','PROTOCOL');
-- 获取Path: /path1/path2
select parse_url('http://www.baidu.com/path1/path2?k1=v1&k2=v2','PATH');
-- 获取url后面的参数以及参数的值:name=zhangsan&age=18,zhangsan
select parse_url('http://www.baidu.com/path1/parth2?name=zhangsan&age=18','QUERY');
select parse_url('http://www.baidu.com/path1/parth2?name=zhangsan&age=18','QUERY','name');
coalesce(col1,col2,col3...)
sql
--返回第一个不为空的数据
select coalesce(null,1,23,4);
array_contains
有如下数据,表示1、2、3三名学生选修了a、b、c中的若干课程
sql
id course
1 a
1 b
2 a
2 c
3 b
3 c
建表并加载数据
sql
--建表
create table courses (
id int,
course string
)
row format delimited
fields terminated by '\t';
--加载数据
load data local inpath '/home/hivedata/course.txt' into table courses;

根据如上数据,查询出如下结果,其中1表示选修,0表示未选修
sql
id a b c
1 1 1 0
2 1 0 1
3 0 1 1
sql
--第一种方法
select id,
sum(case when course='a' then 1 else 0 end ) a,
sum(case when course='b' then 1 else 0 end ) b,
sum(case when course='c' then 1 else 0 end ) c
from zhoukao03 group by id;
--第二种方法
select id,
if(array_contains(collect_set(course),'a'),1,0) a,
if(array_contains(collect_set(course),'b'),1,0) b,
if(array_contains(collect_set(course),'c'),1,0) c
from courses group by id;
-- 第三种写法
select id,
sum(if(course=='a',1,0)) `a`,
sum(if(course=='b',1,0)) `b`,
sum(if(course=='c',1,0)) `c`
from courses group by id;