百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

数仓|Hive条件函数与日期函数全面解析

lipiwang 2024-10-18 09:42 31 浏览 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

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: