数仓|Hive条件函数与日期函数全面解析
lipiwang 2024-10-18 09:42 42 浏览 0 评论
条件函数
assert_true(BOOLEAN condition)
- 解释
如果condition不为true,则抛出异常,否则返回null
- 使用案例
select assert_true(1<2) -- 返回null
select assert_true(1>2) -- 抛出异常
coalesce(T v1, T v2, ...)
- 解释
返回第一个不为null的值,如果都为null,则返回null
- 使用案例
select coalesce(null,1,2,null) -- 返回1
select coalesce(1,null) -- 返回1
select coalesce(null,null) -- 返回null
if(BOOLEAN testCondition, T valueTrue, T valueFalseOrNull)
- 解释
如果testCondition条件为true,则返回第一个值,否则返回第二个值
- 使用案例
select if(1 is null,0,1) -- 返回1
select if(null is null,0,1) -- 返回0
isnotnull(a)
- 解释
如果参数a不为null,则返回true,否则返回false
- 使用案例
select isnotnull(1) -- 返回true
select isnotnull(null) -- 返回false
isnull(a)
- 解释
与isnotnull相反,如果参数a为null,则返回true,否则返回false
- 使用案例
select isnull(null) -- 返回true
select isnull(1) -- 返回false
nullif(a, b)
- 解释
如果参数a=b,返回null,否则返回a值(Hive2.2.0版本)
- 使用案例
select nullif(1,2) -- 返回1
select nullif(1,1) -- 返回null
nvl(T value, T default_value)
- 解释
如果value的值为null,则返回default_value默认值,否则返回value的值。在null值判断时,可以使用if函数给定默认值,也可以使用此函数给定默认值,使用该函数sql特别简洁。
- 使用案例
select nvl(1,0) -- 返回1
select nvl(null,0) -- 返回0
日期函数
add_months(DATE|STRING|TIMESTAMP start_date, INT num_months)
- 解释
start_date参数可以是string, date 或者timestamp类型,num_months参数时int类型。返回一个日期,该日期是在start_date基础之上加上num_months个月,即start_date之后null_months个月的一个日期。如果start_date的时间部分的数据会被忽略。注意:如果start_date所在月份的天数大于结果日期月的天数,则返回结果月的最后一天的日期。
- 使用案例
select add_months("2020-05-20",2); -- 返回2020-07-20
select add_months("2020-05-20",8); -- 返回2021-01-20
select add_months("2020-05-31",1); -- 返回2020-06-30,5月有31天,6月只有30天,所以返回下一个月的最后一天
current_date
- 解释
返回查询时刻的当前日期
- 使用案例
select current_date() -- 返回当前查询日期2020-05-20
current_timestamp()
- 解释
返回查询时刻的当前时间
- 使用案例
select current_timestamp() -- 2020-05-20 14:40:47.273
datediff(STRING enddate, STRING startdate)
- 解释
返回开始日期startdate与结束日期enddate之前相差的天数
- 使用案例
select datediff("2020-05-20","2020-05-21"); -- 返回-1
select datediff("2020-05-21","2020-05-20"); -- 返回1
date_add(DATE startdate, INT days)
- 解释
在startdate基础上加上几天,然后返回加上几天之后的一个日期
- 使用案例
select date_add("2020-05-20",1); -- 返回2020-05-21,1表示加1天
select date_add("2020-05-20",-1); -- 返回2020-05-19,-1表示减一天
date_sub(DATE startdate, INT days)
- 解释
在startdate基础上减去几天,然后返回减去几天之后的一个日期,功能与date_add类似
- 使用案例
select date_sub("2020-05-20",1); -- 返回2020-05-19,1表示减1天
select date_sub("2020-05-20",-1); -- 返回2020-05-21,-1表示加1天
date_format(DATE|TIMESTAMP|STRING ts, STRING fmt)
- 解释
将date/timestamp/string类型转换为一个具体格式化的字符串。
- 使用案例
select date_format('2020-05-20', 'yyyy'); -- 返回2020
select date_format('2020-05-20', 'MM'); -- 返回05
select date_format('2020-05-20', 'dd'); -- 返回20
-- 返回2020年05月20日 00时00分00秒
select date_format('2020-05-20', 'yyyy年MM月dd日 HH时mm分ss秒') ;
select date_format('2020-05-20', 'yy/MM/dd') -- 返回 20/05/20
dayofmonth(STRING date)
- 解释
返回一个日期或时间的天,与day()函数功能相同
- 使用案例
select dayofmonth('2020-05-20') -- 返回20
extract(field FROM source)
- 解释
提取 day, dayofweek, hour, minute, month, quarter, second, week 或者year的值,field可以选择day, dayofweek, hour, minute, month, quarter, second, week 或者year,source必须是一个date、timestamp或者可以转为 date 、timestamp的字符串。注意:Hive 2.2.0版本之后支持该函数
- 使用案例
select extract(year from '2020-05-20 15:21:34.467'); -- 返回2020,年
select extract(quarter from '2020-05-20 15:21:34.467'); -- 返回2,季度
select extract(month from '2020-05-20 15:21:34.467'); -- 返回05,月份
select extract(week from '2020-05-20 15:21:34.467'); -- 返回21,同weekofyear,一年中的第几周
select extract(dayofweek from '2020-05-20 15:21:34.467'); -- 返回4,代表星期三
select extract(day from '2020-05-20 15:21:34.467'); -- 返回20,天
select extract(hour from '2020-05-20 15:21:34.467'); -- 返回15,小时
select extract(minute from '2020-05-20 15:21:34.467'); -- 返回21,分钟
select extract(second from '2020-05-20 15:21:34.467'); -- 返回34,秒
year(STRING date)
- 解释
返回时间的年份,可以用extract函数替代
- 使用案例
select year('2020-05-20 15:21:34'); -- 返回2020
quarter(DATE|TIMESTAMP|STRING a)
- 解释
返回给定时间或日期的季度,1至4个季度,可以用extract函数替代
- 使用案例
select quarter('2020-05-20 15:21:34'); -- 返回2,第2季度
month(STRING date)
- 解释
返回时间的月份,可以用extract函数替代
- 使用案例
select month('2020-05-20 15:21:34') -- 返回5
day(STRING date),
- 解释
返回一个日期或者时间的天,可以用extract函数替代
- 使用案例
select day("2020-05-20"); -- 返回20
select day("2020-05-20 15:05:27.5"); -- 返回20
hour(STRING date)
- 解释
返回一个时间的小时,可以用extract函数替代
- 使用案例
select hour('2020-05-20 15:21:34');-- 返回15
minute(STRING date)
- 解释
返回一个时间的分钟值,可以用extract函数替代
- 使用案例
select minute('2020-05-20 15:21:34'); -- 返回21
second(STRING date)
- 解释
返回一个时间的秒,可以用extract函数替代
- 使用案例
select second('2020-05-20 15:21:34'); --返回34
from_unixtime(BIGINT unixtime [, STRING format])
- 解释
将将Unix时间戳转换为字符串格式的时间(比如yyyy-MM-dd HH:mm:ss格式)
- 使用案例
select from_unixtime(1589960708); -- 返回2020-05-20 15:45:08
select from_unixtime(1589960708, 'yyyy-MM-dd hh:mm:ss'); -- -- 返回2020-05-20 15:45:08
select from_unixtime(1589960708, 'yyyy-MM-dd'); -- 返回2020-05-20
from_utc_timestamp(T a, STRING timezone)
- 解释
转换为特定时区的时间
- 使用案例
select from_utc_timestamp('2020-05-20 15:21:34','PST'); -- 返回2020-05-20 08:21:34.0
select from_utc_timestamp('2020-05-20 15:21:34','GMT'); -- 返回2020-05-20 15:21:34.0
select from_utc_timestamp('2020-05-20 15:21:34','UTC'); -- 返回2020-05-20 15:21:34.0
select from_utc_timestamp('2020-05-20 15:21:34','DST'); -- 返回2020-05-20 15:21:34.0
select from_utc_timestamp('2020-05-20 15:21:34','CST'); -- 返回2020-05-20 10:21:34.0
last_day(STRING date)
- 解释
返回给定时间或日期所在月的最后一天,参数可以是'yyyy-MM-dd HH:mm:ss' 或者 'yyyy-MM-dd'类型,时间部分会被忽略
- 使用案例
select last_day('2020-05-20 15:21:34'); -- 返回2020-05-31
select last_day('2020-05-20'); -- 返回2020-05-31
to_date(STRING timestamp)
- 解释
返回一个字符串时间的日期部分,去掉时间部分,2.1.0之前版本返回的是string,2.1.0版本及之后返回的是date
- 使用案例
select to_date('2020-05-20 15:21:34'); -- 返回2020-05-20
select to_date('2020-05-20'); -- 返回2020-05-20
to_utc_timestamp(T a, STRING timezone)
- 解释
转换为世界标准时间UTC的时间戳,与from_utc_timestamp类似
- 使用案例
select to_utc_timestamp('2020-05-20 15:21:34', 'GMT'); -- 返回2020-05-20 15:21:34.0
trunc(STRING date, STRING format)
- 解释
截断日期到指定的日期精度,仅支持月(MONTH/MON/MM)或者年(YEAR/YYYY/YY)
- 使用案例
select trunc('2020-05-20', 'YY'); -- 返回2020-01-01,返回年的1月1日
select trunc('2020-05-20', 'MM'); -- 返回2020-05-01,返回月的第一天
select trunc('2020-05-20 15:21:34', 'MM'); -- 返回2020-05-01
unix_timestamp([STRING date [, STRING pattern]])
- 解释
参数时可选的,当参数为空时,返回当前Unix是时间戳,精确到秒。可以指定一个具体的日期,转换为Unix时间戳格式
- 使用案例
-- 返回1589959294
select unix_timestamp('2020-05-20 15:21:34','yyyy-MM-dd hh:mm:ss');
-- 返回1589904000
select unix_timestamp('2020-05-20','yyyy-MM-dd');
weekofyear(STRING date)
- 解释
返回一个日期或时间在一年中的第几周,可以用extract替代
- 使用案例
select weekofyear('2020-05-20 15:21:34'); -- 返回21,第21周
select weekofyear('2020-05-20'); -- 返回21,第21周
next_day(STRING start_date, STRING day_of_week)
- 解释
参数start_date可以是一个时间或日期,day_of_week表示星期几,比如Mo表示星期一,Tu表示星期二,Wed表示星期三,Thur表示星期四,Fri表示星期五,Sat表示星期六,Sun表示星期日。如果指定的星期几在该日期所在的周且在该日期之后,则返回当周的星期几日期,如果指定的星期几不在该日期所在的周,则返回下一个星期几对应的日期
- 使用案例
select next_day('2020-05-20','Mon');-- 返回当前日期的下一个周一日期:2020-05-25
select next_day('2020-05-20','Tu');-- 返回当前日期的下一个周二日期:2020-05-26
select next_day('2020-05-20','Wed');-- 返回当前日期的下一个周三日期:2020-05-27
-- 2020-05-20为周三,指定的参数为周四,所以返回当周的周四就是2020-05-21
select next_day('2020-05-20','Th');
select next_day('2020-05-20','Fri');-- 返回周五日期2020-05-22
select next_day('2020-05-20','Sat'); -- 返回周六日期2020-05-23
select next_day('2020-05-20','Sun'); -- 返回周六日期2020-05-24
该函数比较重要:比如取当前日期所在的周一和周日,通过长用在按周进行汇总数据
select date_add(next_day('2020-05-20','MO'),-7); -- 返回当前日期的周一日期2020-05-18
select date_add(next_day('2020-05-20','MO'),-1); -- 返回当前日期的周日日期2020-05-24
months_between(DATE|TIMESTAMP|STRING date1, DATE|TIMESTAMP|STRING date2)
- 解释
返回 date1 和 date2 的月份差。如果date1大于date2,返回正值,否则返回负值,如果是相减是整数月,则返回一个整数,否则会返回小数
- 使用案例
select months_between('2020-05-20','2020-05-20'); -- 返回0
select months_between('2020-05-20','2020-06-20'); -- 返回-1
-- 相差的整数月
select months_between('2020-06-30','2020-05-31'); -- 返回1
-- 非整数月,一个月差一天
select months_between('2020-06-29','2020-05-31'); -- 返回0.93548387
相关推荐
- 一个简单便捷搭建个人知识库的开源项目(MDwiki)
-
这里我通过自动翻译软件,搬运总结MDwiki官网的部署和使用方法。第一步:下载编译好的后MDwiki文件,只有一个HTML文件“mdwiki.html”。第二步:在mdwiki.html同级目录创建“...
- 强大、简洁、快速、持续更新 PandaWiki新一代 AI 驱动的开源知识库
-
PandaWiki是什么PandaWiki是一款AI大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供AI创作、AI问答...
- DeepWiki-Open: 开源版Deepwiki,可自己构建github文档库
-
Deepwiki是Devin团队开发的github文档库,用户能免费使用,但代码不是开源,而DeepWiki-Open侧是开源版本的实现。DeepWiki-Open旨在为GitHub和GitLa...
- 最近爆火的wiki知识管理开源项目PandaWiki
-
项目介绍PandaWiki是一款AI大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供AI创作、AI问答、AI搜索等...
- 轻量级开源wiki系统介绍(轻量开源论坛系统)
-
wiki系统有很多DokuWiki、MediaWiki、MinDoc等等都是开源的wiki系统。商业版的wiki,像很多企业在用的confluence等。今天我们讲的是一款轻量级且开源的文档管理系统:...
- DNS解析错误要怎么处理(dns解析状态异常怎么办)
-
在互联网时代,网络已经成为人们生活和工作中不可或缺的一部分。然而,当遇到DNS解析错误时,原本畅通无阻的网络访问会突然陷入困境,让人感到十分困扰。DNS,即域名系统,它如同互联网的电话簿,将人们易于...
- 网页加载慢?这些方法让你秒开网页!
-
打开浏览器,信心满满地准备查资料、看视频或者追剧,却发现网页怎么都打不开!是不是瞬间感觉手足无措?别慌,这个问题其实挺常见,而且解决起来并没有你想象的那么复杂。今天就来聊聊网页打不开究竟是怎么回事,以...
- windows11 常用CMD命令大全(windows11msdn)
-
Windows11中的命令提示符(CMD)是一个强大的工具,可以通过命令行执行各种系统操作和管理任务。以下是一些常用的CMD命令,按功能分类整理,供你参考:一、系统信息与状态systeminfo显...
- 电脑提示DNS服务器未响应怎么解决?
-
我们在使用电脑的时候经常会遇到各种各样的网络问题,例如最近就有Win11电脑用户在使用的时候遇到了DNS未响应的问题,遇到这种情况我们应该怎么解决呢? 方法一:刷新DNS缓存 1、打开运行(W...
- 宽带拨号错误 651 全解析:故障定位与修复方案
-
在使用PPPoE拨号连接互联网时,错误651提示「调制解调器或其他连接设备报告错误」,通常表明从用户终端到运营商机房的链路中存在异常。以下从硬件、系统、网络三层维度展开排查:一、故障成因分类图...
- 如何正确清除 DNS 缓存吗?(解决你访问延时 )
-
DNS缓存是一个临时数据库,用于存储有关以前的DNS查找的信息。换句话说,每当你访问网站时,你的操作系统和网络浏览器都会保留该域和相应IP地址的记录。这消除了对远程DNS服务器重复查询的...
- 网络配置命令:ipconfig和ifconfig,两者有啥区别?
-
在计算机网络的世界里,网络接口就像是连接你电脑和外部网络的桥梁,而网络配置则是确保这座桥梁稳固、通信顺畅的关键。提到网络配置工具,ipconfig和ifconfig绝对是两个绕不开的名字。它们一...
- 救急的命令 你会几个?(救急一下)
-
很多人都说小编是注册表狂魔,其实不完全是,小编常用的命令行才是重点。其实所谓的命令行都是当初DOS时代的标准操作方式,随着Windows不断演化,DOS的命令早已成为Windows的一部分了——开始菜...
- 电脑有网却访问不了GitHub原来是这样
-
当满心欢喜打开电脑,准备在GitHub这个“开源宝藏库”里挖掘点超酷的项目,却遭遇了网页无法访问的尴尬。看着屏幕上那令人无奈的提示,原本高涨的热情瞬间被泼了一盆冷水,是不是感觉世界都不美好了...
- rockstargames更新慢| r星更新速度 怎么办 解决办法
-
rockstargames更新慢|r星更新速度怎么办解决办法说到RockstarGames,那可是游戏界的大佬,作品个顶个的经典。但话说回来,每当新内容更新时,那蜗牛般的下载速度,真是让人急得...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)