写在前面
我相信很多在做BI产品的小伙伴都会 遇到按周 月 季度 年进行数据的聚合的场景,比如说某个产品每周销售额 月销售额 季度销售额。目前我工作主要用到的几种SQL引擎有MySQL,Hive,Presto 。然后我这里把一些常见的操作整理一下,方便查阅。
后面我也有 慢慢更新这个 系列的文章,我会把我这块工作相关的一些体会进行分享,绝对实用~欢迎关注,
– 1.mysql
-- 当天日期
select date(now())
select date_sub(current_date,interval dayofweek(current_date) day)
select weekday(current_date()) -- 周日 6 周一 0
select dayofweek(current_date()) -- 周日 1 周一 2
-- 当天日期的周一 :
select date_sub(current_date(),interval weekday(current_date()) day) -- 用当前日期 - 距离周一的天数
-- 当天日期的周日
select date_sub(current_date(),interval -6+weekday(current_date()) day) -- 用当前日期 - (-6+距离周一的天数)
-- 当天日期的 对应的 当月1号 :
select date_sub(current_date , interval dayofmonth(current_date) - 1 day)-- 用当前日期 - 当天是当月的第几天
-- 当天日期的 对应的 当月最后一天 :
-- 这里提供一种思路,可以先把当天对应的上月的最后一天计算出来,然后再用lead之类的窗口函数取下一行数据
-- 当天日期的 对应的 当季度1号 :
select (makedate(year(current_date), 1) + interval quarter(current_date) quarter - interval 1 quarter)
-- 当天日期的 对应的 当年1号 :
select makedate(year(current_date),1)
– 2.hive
-- 当天日期
select current_date,to_date(current_date),current_timestamp
-- 当天日期的周一 :
-- 当天日期对应的下周1 :next_day(current_date,'mon')
select date_sub(next_day(current_date,'mon'),7) -- 本周1
select date_sub(next_day(current_date,'tu'),7) -- 本周2
select date_sub(next_day(current_date,'wed'),7) -- 本周3
select date_sub(next_day(current_date,'th'),7) -- 本周4
select date_sub(next_day(current_date,'fri'),7) -- 本周5
select date_sub(next_day(current_date,'sat'),7) -- 本周6
select date_sub(next_day(current_date,'sun'),7) -- 本周天
-- 当天日期的 对应的 当月1号 :
select trunc(current_date, 'mm')
-- 当天日期的 对应的 当季度1号 :
select to_date(concat(year(current_date),'-',lpad(ceil(month(current_date)/3) * 3 -2,2,0),'-01'))
-- 当天日期的 对应的 当年1号 :
select trunc(current_date, 'yy')
– 3.presto
-- 当天日期
select now(),current_date,current_timestamp
-- day_of_week(current_date) 周日 7 周一 1
-- 当天日期的周一 :
select date_add('day',+1-day_of_week(current_date),current_date)
-- 当天日期的周天:
select date_add('day',+7-day_of_week(current_date),current_date)
-- day_of_month(current_date) 当月的第几天
-- 当天日期的 对应的 当月1号 :
select date_add('day',-day_of_month(current_date)+1,current_date)