首页 > 数据库 >【SQL】Hive/Spark SQL笔记之时间函数、环比/同比/时间比较计算

【SQL】Hive/Spark SQL笔记之时间函数、环比/同比/时间比较计算

时间:2024-10-30 20:19:55浏览次数:7  
标签:format zdt dd Hive yyyy add SQL date Spark

获取当天:

'${zdt.format("yyyy-MM-dd")}'

//获取上月月末

select '${zdt.lastMonth().format("yyyy-MM-dd")}'

T-1上月末

select '${zdt.addDay(-1).lastMonth().format("yyyyMMdd")}'

1个小时前

select '${zdt.addHour(-1).format("yyyy-MM-dd")}'

昨天

select '${zdt.addDay(-1).format("yyyy-MM-dd")}'

前天

select '${zdt.addDay(-2).format("yyyy-MM-dd")}' 

add(3,-1) 表示上一周 参数3 为周(7天,非自然周)

select '${zdt.add(3,-1).format("yyyy-MM-dd")}'

//下一周

select '${zdt.add(3,1).format("yyyy-MM-dd")}'

add(2,-1) 表示上个月 参数2 为月

select '${zdt.add(2,-1).format("yyyy-MM-dd")}'

下个月:

select '${zdt.add(2,1).format("yyyy-MM-dd")}'

add(1,-1) 表示去年 参数1 为年

select '${zdt.add(1,-1).format("yyyy-MM-dd")}'去年的今天

//明年

select '${zdt.add(1,1).format("yyyy-MM-dd")}'


经常用到的时间维度对比:

---常用日期对比维度
where (ds = '${zdt.addDay(-1).format("yyyyMMdd")}' --mtd日期T-1日期
or ds='${zdt.addDay(-1).lastMonth().format("yyyyMMdd")}'--T-1上月末
or ds= '${zdt.addDay(-1).add(2,-1).format("yyyyMMdd")}' -- 上月T-1同期
or ds='${zdt.addDay(-1).add(1,-1).format("yyyyMMdd")}'  -- 上年T-1同期
or ds='${zdt.addDay(-1).add(1,-1).lastMonth().format("yyyyMMdd")}')-- 去年上月月末
or ds='${zdt.addDay(-1).add(1,-1).format("yyyy")}1231' 上年年末

---希望自己想要的时间分区为T-1日期的上月末
where  cast(format_datetime(date_parse(ds,'%Y%m%d'),'yyyy-MM-dd') as date) = date_add('day', -1, date_add('month', 1, date_trunc('month', cast('${zdt.addDay(-1).format("yyyy-MM-dd")}' as date))))
----希望自己想要的时间分区为T-1日期的那个月的月末
where  cast(format_datetime(date_parse(ds,'%Y%m%d'),'yyyy-MM-dd') as date) = date_add('day', -1, date_add('month', 1, date_trunc('month', cast('${zdt.addDay(-1).format("yyyy-MM-dd")}' as date))))

将两个不同的日期按自己的想法对齐

在lef join 两个不同的表格中,需要时间维度按自己的想法对齐

如:希望一个表的T-1日期维度下的数据=另外一个表的上月末日期(用户ID相等)

先将另外一个表只取每月月末数据,然后用下面的代码

on cast (a.cm_id as varchar)=cast (c.cm_id as varchar) and substr(cast(a.date as varchar),1,7)= substr(cast(date_add('month', 1 , cast(format_datetime(date_parse(c.dt,'%Y%m%d'),'yyyy-MM-dd') as date)) as varchar),1,7)

只取过去每年每月月末和T-1日期数据

where (dt>='20230101'
  and (substr(dt,5,4) in ('0131','0229','0331','0430','0531','0630','0731','0831','0930','1031','1130','1231')      
  or (dt like '%0228' and mod(cast(substr(dt,1,4) as bigint),4) in (1,2,3)))
   or dt='${zdt.addDay(-1).format("yyyyMMdd")}')

将日期减一天,加一天则是date_add('day',1,xxx)

SELECT date_add('day',-1, cast(format_datetime(date_parse(ds,'%Y%m%d'),'yyyy-MM-dd') as date))

月份进行相减,计算想要的日期相差多少个月

--prestro语法里:是将日期所在的月份进行相减:
date_diff('month',cast(concat(substr(t1.first_confirm_date,1,7),'-01') as date),cast(concat(substr(t3.stat_dt,1,7),'-01') as date)) as mob
---KYUUBI(SPARK)语法里,将日期所在的月份进行相减:
months_between(cast(concat(substr(t1.first_confirm_date,1,7),'-01') as date),cast(concat(substr(t3.stat_dt,1,7),'-01') as date)) as mob
---KYUUBI(SPARK)语法里,简单将日期直接进行相减获取相差多少天
 datediff(cast(date AS date), cast(stat_dt AS date)) as days

标签:format,zdt,dd,Hive,yyyy,add,SQL,date,Spark
From: https://blog.csdn.net/2401_86694489/article/details/143342017

相关文章

  • MySQL索引
    索引概述介绍索引(index)是帮助MySQL高效获取数据的数据结构(且有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。优缺点索引结构MySQL的索引是在存储引......
  • MySQL存储引擎——针对实习面试
    目录MySQL支持哪些存储引擎?MySQL存储引擎架构了解嘛?MyISAM和InnoDB有什么区别?MyISAM和InnoDB如何选择?如何查看表的存储引擎?如何修改表的存储引擎?MySQL支持哪些存储引擎?MySQL支持多种存储引擎,包括InnoDB、MyISAM、MEMORY、ARCHIVE、BLACKHOLE、FEDERATED、NDBCluste......
  • Ubuntu22 mysql8 MHA高可用
    mha-manager地址:https://github.com/yoshinorim/mha4mysql-managermha-node地址:https://github.com/yoshinorim/mha4mysql-node mha有mha-manager和mha-node2个组件由于主节点有可能会被切换成从节点,而每一个从节点也有可能会被切换成主节点所以MHA对Mysql复制环境有特......
  • mybatis动态SQL
    目前项目中写动态SQL,用的都是下面的语法:@Select("<script>"+"SELECTwr.id,wr.customer_id,wr.type,wr.detailfromxxxrel"+"LEFTJOINxxxwronrel.rule_id=wr.idwhererel.entity_id=#{entityId}andwr.customer_id=#{......
  • Mysql梳理11——聚合函数
    Mysql梳理11——聚合函数Mysql梳理11——聚合函数11.1引言11.2聚合函数介绍11.2.1什么是聚合函数11.2.2聚合函数类型11.2.3聚合函数语法11.3具体聚合函数11.3.1AVG和SUM函数11.3.2MIN和MAX函数11.3.3COUNT函数11.4GROUPBY11.4.1基本使用11.4.2使用多个列......
  • SQL Server创建用户只能访问指定数据库和视图
    我们在给数据库用户赋予权限时,有时候不想让该用户看到太多过程表和过程视图,这时就需要限定用户的访问权限第一步:创建用户创建数据库连接后,进入安全性——登录名,单击右键,新建登录名,并设置默认数据库第二步:设置用户映射点击用户映射,勾选指定要访问的数据库,数据库成员身份默认......
  • MySQL敏感数据进行加密的几种方法
    使用MySQL内置的加密函数AES_ENCRYPT和AES_DECRYPT函数方法介绍:AES(AdvancedEncryptionStandard)是一种对称加密算法。在MySQL中,可以使用AES_ENCRYPT函数对数据进行加密,使用AES_DECRYPT函数进行解密。这种加密方式的特点是加密和解密使用相同的密钥。示例:......
  • MySQL如何输出自己的AWR分析报告
    一、启用慢查询日志配置慢查询日志参数编辑MySQL配置文件(通常是my.cnf或my.ini),找到以下参数并进行设置。slow_query_log:将其设置为1以启用慢查询日志。例如:slow_query_log=1。long_query_time:定义查询执行时间的阈值,超过这个时间的查询会被记录到慢查询日志中。单......
  • MYSQL索引相关
    原sqlSELECTid,user_id,package_id,term_id,source,type,order_id,code_record_id,created_at,updated_at,version,is_deletedASdeletedFROMtbl_purchased_packageWHERE(ter......
  • SQL执行顺序及where、group by及having
    SQL执行顺序及where、groupby及having一、SQL的书写与执行顺序SQL语句书写顺序select、form、where、group by、having、select、orderby、limit SQL语句执行顺序from、where、group by、having、select、order by、limit当然如果有join,肯定优先级是join,接下来是from......