SQL+HIVE 题目:查询下周过生日的学生

就这短短一个小问,本人汗颜,花了近两个小时才搞明白,具体步骤如下,望指正!
1、表内容
在这里插入图片描述
    首先考虑什么是下周:现在可以得到的是现在的时间,current_data(),在通过dayofweek可以知道现在是周几。
    确定星期几之后,就要弄清楚从今天到下周一差了几天,经过测试可以发现用9减去星期数在加上当前日期就可以得到下周一的日期,然后在用date_add(),就可以计算出下周日的日期
    最后就是排查学生生日的月份和天数在这两个日期之间的人,本人就是一直在这里卡壳了,首先我直接想取出月份和天数,这个是可以用正则regexp_extract,也可以用日期格式化输出date_format(),只去‘M-d’。当然这里还比较容易想,但最关键的就是用后者取出来的数据不能直接用month和day单独取出对应位置上的数,所有这之后我又想到是不是可以把月份和天数截取出来,再转为Int类型或者字符串类型直接进行比较:collect_list(cast(regexp_replace(birthday,’-’,’’) as int)),这样处理之后的确将月份和天数拼接成了一个字符串或者转化为了一个数值,但是由于一些不可知的原因,转换之后的数不能通过常规方法,即大于小于或者between,and比较,最终也只能放弃。
    好在脑子没有一直糊涂下去,最后我发现,其实并不需要把月份或天数取出来或者进行拼接等诸如此类的操作,仅仅只需要,在日期状态下,直接用month和day取出对应月份和天数,在和birthday中的月份,天数进行比较即可。(需要注意的就是,下周也可能出现跨月份的情况,需要详情考虑)
具体代码如下:

select
name,birthday
from
(
select
next_monday,date_add(next_monday,6) next_sunday
from
(
select date_add(current_date(),9-dayofweek(current_date())) as next_monday
)A
)B,student
where
month(birthday)>=month(next_monday)
and
month(birthday)<=month(next_sunday)
and
(
day(birthday)>=day(next_monday)
or
day(birthday)<=day(next_sunday)
)
;

结果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值