首页 > 数据库 >SQL:日期函数及常见的日期换算

SQL:日期函数及常见的日期换算

时间:2022-10-13 01:11:21浏览次数:48  
标签:10 01 current 日期 换算 2022 SQL date select

由于工作主要涉及hive和MySQL,两个平台大部分函数在名称和功能上都是相同的 ,个别有差异,根据需要自去验证。

1、截取日期的部分

  second(date):返回日期中的秒
  minute(date):返回日期中的分钟
  hour(date):返回日期中的小时
  day(date):返回日期中的天
  week(date):返回日期在当前周数
  month(date):返回日期中的月份
  year(date):返回日期中的年

  day(date):day('2021-01-10'),返回日期的‘日’部分值。

select  day('2021-01-10') d;    输出结果:==> 10

 

2、current_date()/curdate() : 与now()函数一样,返回当前日期,与now()函数不同的是current_date()返回的是string,now()返回的是timestamp格式

select  current_date() cc,curdate() c,now() n 

 

3、date_add/date_sub(date,n):这是hive平台的模式,在给定的日期加/减 n天,这是hive平台的模式,只作日期的加减。 

select date_add('2022-10-10',7)       输出:2022-10-17

 

4、date_add/date_sub(date,interval expr type):这是MySQL平台的模式,根据type类型,在给定的日期上加/减一个时间单位


select date_sub('2022-10-10',INTERVAL 10 day ) sub_day,       输出:2022-09-30
date_sub('2022-10-10',INTERVAL 12 month ) sub_month,       输出:2021-10-10
date_sub('2022-10-10',INTERVAL 3 year ) sub_year      输出:2019-10-10

type 参数可以是下列值:
MICROSECOND,SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER,YEAR,SECOND_MICROSECOND,MINUTE_MICROSECOND,MINUTE_SECOND
,HOUR_MICROSECOND,HOUR_SECOND,HOUR_MINUTE,DAY_MICROSECOND,DAY_SECOND,DAY_MINUTE,DAY_HOUR,YEAR_MONTH

 

5、datediff(date1,date2):date1-date2,返回两个日期间的天数差;个别系统这个函数有第三个参数,更改第三个参数值可以得到两个时间的年、月、日、时、分、秒等差值。

select  datediff('2021-01-01','2022-01-01') days;     输出结果:==> -365

 

 6、last_day(date):hive平台函数,返回给定日期所在月份的最后月末日期

select last_day('2022-10-10')            输出:2022-10-31

 

7、trunc(date,fmt):根据fmt截取日期,以下为trunc常用的几种情形

select trunc(date,'YEAR')        返回日期所在年的第一天  
select trunc(date, 'MM')       返回日期所在月份的第一天
select trunc(date, 'Q')       返回日期所在季度的第一天 
select trunc(date,'d')        返回日期所在星期的第一天(星期天)
select trunc(date, 'hh')       返回当前时间小时的开始,如当前时间为2022-10-10 16:47:23 返回2012-10-10 16:00:00  

 

8、date_sub + trunc + add_months + last_day:以指定日期为参考点,返回特定的月初、月末,自定义报表统计中常用。

select trunc(add_months(current_date,-1),'MM')  上月初
select trunc(add_months(current_date,1),'MM')  下月初

select date_sub(trunc(current_date,'MM'),1)  上月末
select last_daty(add_months(current_date,-1))  上月末
select last_daty(add_months(current_date,1)) 下月末

 

9、unix_timestamp():返回当前时间戳,或把给定的日期转换成时间戳

select unix_timestamp() tm1;  -- 当前时间戳 
select (unix_timestamp('2022-10-10 12:03:55') - unix_timestamp('2022-10-10 11:03:55')) tm2; -- 秒差 
select (unix_timestamp('2018-05-25 12:03:55') - unix_timestamp('2018-05-25 11:03:55'))/60 tm3; -- 分钟差 
select (unix_timestamp('2018-05-25 12:03:55') - unix_timestamp('2018-05-25 11:03:55'))/3600 tm4; -- 小时差 

 

10、next_day(date,fmt):返回给定日期对应的下个星期的指定星期几,由于一般运营工作中周会一般很少在周一,大多会是每周周二、周四,因此周报一般也不是正常的周一到周日,而是上周二到本周一、上周四到本周三之类,因此,这个函数在周报统计就显得非常实用了,fmt参数: MO 周一;TU 周二;WE 周三;TH 周四;FR 周五;SA 周六;SU周日。

select next_day(current_date(),'MO'); -- 下周一
select next_day(current_date,'MO'); -- 下周末
select date_sub(next_day(current_date(),'MO'),7) ; -- 本周一
select date_sub(next_day(current_date,'MO'),1); -- 本周末

 

12、pmod + datediff:返回给定日期的是星期几

select pmod(datediff(current_date, '2012-01-01'), 7) ss;  -- 当等于0是当前天为星期日
select pmod(datediff(current_date, '2012-01-01'), 7) ss;  -- 当等于1是当前天为星期1
select pmod(datediff(current_date, '2012-01-01'), 7) ss;  -- 当等于2是当前天为星期2
select pmod(datediff(current_date, '2012-01-01'), 7) ss;  -- 当等于3是当前天为星期3
select pmod(datediff(current_date, '2012-01-01'), 7) ss;  -- 当等于4是当前天为星期4
select pmod(datediff(current_date, '2012-01-01'), 7) ss;  -- 当等于5是当前天为星期5
select pmod(datediff(current_date, '2012-01-01'), 7) ss;  -- 当等于6是当前天为星期6  

 

13、weekday(date):返回给定日期是星期几,0 周一,1 周二,2 周三,3 周四,4 周五,5 周六,6 周日

 

14、from_unixtime : 转化unix时间戳到当前时区的时间格式,from_unixtime +unix_timestamp Hive中yyyymmdd和yyyy-mm-dd日期之间的切换

select from_unixtime(1665374635,’yyyyMMdd’); -- 输出:20221010
select from_unixtime(unix_timestamp('20221010','yyyymmdd'),'yyyy-mm-dd') ;  -- 20221010转成2022-10-10
select from_unixtime(unix_timestamp('2022-10-10','yyyy-mm-dd'),'yyyymmdd');  -- 2022-10-10转成2022-10-10

 

date_format(date,format):格式日期

select  date_format(NOW(),'%b %d %Y %h:%i %p') df1,       输出结果:==> Oct 12 2022 09:59 PM
date_format(NOW(),'%m-%d-%Y') df2,      输出结果:==>  10-12-2022
date_format(NOW(),'%d %b %y') df3,      输出结果:==>  12 Oct 22
date_format(NOW(),'%d %b %Y %T:%f') df4;       输出结果:==>  12 Oct 2022 21:59:58:000000
格式描述
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位

标签:10,01,current,日期,换算,2022,SQL,date,select
From: https://www.cnblogs.com/bigcat-sniffs-the-rose/p/16786257.html

相关文章