天天看点

奇淫巧技,难缠的日期处理大全,真香

文章目录

  • ​​前言​​
  • ​​🚀 1.MySQL​​
  • ​​🌈 1.1 日期类型​​
  • ​​🌈 1.2 当前时间​​
  • ​​🌈 1.3.日期格式化​​
  • ​​🌈 1.4.日期加减​​
  • ​​🚀 2.Oracle​​
  • ​​🌈 2.1.日期函数​​
  • ​​🌈 2.2.连续的日期​​
  • ​​🌈 2.3.区间日期​​
  • ​​🚀 3.java​​
  • ​​🌈 3.1.常用日期设置​​
  • ​​🌈 3.2.年/月/周/天​​

前言

要论日常遇到的数据类型中,哪种最复杂最麻烦?答案肯定就是日期型数据了,而且最常用地方就是字符串与日期类型的相互转换。

🚀 1.MySQL

🌈 1.1 日期类型

DATE:YYYY-MM-DD 日期值

TIME:HH:MM:SS 时间值或持续时间

YEAR:YYYY 年份值

DATETIME:YYYY-MM-DD HH:MM:SS 混合日期和时间值

TIMESTAMP:YYYYMMDDHHMMSS 混合日期和时间值,时间戳

🌈 1.2 当前时间

🚩 SQL算出母亲节日期,年、月、周、天别

select

year(curdate()) ‘年份’,

month(curdate()) ‘月份’,

weekofyear(curdate()) ‘本年周’,

dayofyear(curdate()) ‘本年天’,

DATE_FORMAT(now(), ‘%Y-%m-%d’) ‘日期’,

TIMESTAMPDIFF(YEAR,‘1913-05-01’, DATE_FORMAT(now(), ‘%Y-%m-%d’)) ‘多少个母亲节’\G

奇淫巧技,难缠的日期处理大全,真香

🚩 SQL计算时分秒及周

select

now(),

curdate(),

curtime(),

year(now()),

MONTH(now()),

day(now()),

hour(now()),

minute(now()),

second(now()),

monthname(now()),

DAYNAME(now()) \G

奇淫巧技,难缠的日期处理大全,真香

🌈 1.3.日期格式化

🚩 date_format(date,format),根据format字符串格式化date值

%m 月名字(january……december)   
 %w 星期名字(sunday……saturday)   
 %d 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)   
 %y 年, 数字, 4 位   
 %y 年, 数字, 2 位   
 %a 缩写的星期名字(sun……sat)   
 %d 月份中的天数, 数字(00……31)   
 %e 月份中的天数, 数字(0……31)   
 %m 月, 数字(01……12)   
 %c 月, 数字(1……12)   
 %b 缩写的月份名字(jan……dec)   
 %j 一年中的天数(001……366)   
 %h 小时(00……23)   
 %k 小时(0……23)   
 %h 小时(01……12)   
 %i 小时(01……12)   
 %l 小时(1……12)   
 %i 分钟, 数字(00……59)   
 %r 时间,12 小时(hh:mm:ss [ap]m)   
 %t 时间,24 小时(hh:mm:ss)   
 %s 秒(00……59)   
 %s 秒(00……59)   
 %p am或pm   
 %w 一个星期中的天数(0=sunday ……6=saturday )   
 %u 星期(0……52), 这里星期天是星期的第一天   
 %u 星期(0……52), 这里星期一是星期的第一天   
 %% 字符%      

格式:200005

DATE_FORMAT(‘2000-05-07’, ‘%Y%m’) – 202105

DATE_FORMAT(‘2000-05-07’, ‘%Y-%m’) – 2021-05

格式:20000507

DATE_FORMAT(‘2000-05-07’, ‘%Y%m%d’) – 20000507

格式:2020-01-01

DATE_FORMAT(“20000101”, ‘%Y-%m-%d’) – 2020-01-01

DATE_FORMAT(“2000-01-01”, ‘%Y-%m-%d’) – 2020-01-01

格式:05:06:07

DATE_FORMAT(‘2000-05-07 05:06:07’, ‘%H:%i:%s’) – 05:06:07 (24小时制)

DATE_FORMAT(‘2000-05-07 05:06:07’, ‘%h:%i:%s’) – 05:06:07 (12小时制)

格式:2000-05-07 05:06:07

DATE_FORMAT(‘2000-05-07 05:06:07’, ‘%Y-%m-%d %H:%i:%s’) – 2000-05-07 05:06:07

格式:2000-05-07 05:06:07 Sun

DATE_FORMAT(‘2000-05-07 05:06:07’, ‘%Y-%m-%d %H:%i:%s %a’) – 2000-05-07 05:06:07 Sun

奇淫巧技,难缠的日期处理大全,真香

🌈 1.4.日期加减

🚩 date_add(date,interval expr type)

date是一个datetime或date值,

expr对date进行加减法的一个表达式字符串

type指明表达式expr应该如何被解释

set @dt = now();

select date_add(@dt, interval 1 day); - 加1天

select date_add(@dt, interval 1 hour); -加1小时

select date_add(@dt, interval 1 minute); - 加1分钟

select date_add(@dt, interval 1 second); -加1秒

select date_add(@dt, interval 1 microsecond); -加1毫秒

select date_add(@dt, interval 1 week); -加1周

select date_add(@dt, interval 1 month); -加1月

select date_add(@dt, interval 1 quarter); -加1季

select date_add(@dt, interval 1 year); -加1年

奇淫巧技,难缠的日期处理大全,真香

🚩 datediff(date1,date2):两个日期相减 date1 date2,返回天数

select datediff(‘2022-05-22’, ‘2022-05-01’);

奇淫巧技,难缠的日期处理大全,真香

🚩 date_sub()

与date_add()函数用法一致,为日期减去一个时间间隔,这个只能使用interval时间作为参数

mysql> select date_sub(now(), interval 1 day); --减1天

mysql> select date_sub(now(), interval 1 hour); --减1小时

mysql> select date_sub(now(), interval 1 minute); --减1分钟

mysql> select date_sub(now(), interval 1 second); --减1秒

mysql> select date_sub(now(), interval 1 microsecond); --减1毫秒

mysql> select date_sub(now(), interval 1 week); --减1周

mysql> select date_sub(now(), interval 1 month); --减1月

mysql> select date_sub(now(), interval 1 quarter); --减1季

mysql> select date_sub(now(), interval 1 year); – 减1年

奇淫巧技,难缠的日期处理大全,真香

🚀 2.Oracle

🌈 2.1.日期函数

✨✨ 2.1.1 日期格式:DD-MON-RR

✨✨ 2.1.2 设置会话时间格式

alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss day’;

select sysdate from dual;

select sysdate,sysdate+1/24 from dual;

select sysdate,sysdate+1/24/60 from dual;

✨✨ 2.1.3 months_between

select empno,ename,sal, months_between(sysdate,hiredate) months from emp;

✨✨ 2.1.4 add_months

select sysdate from dual; select sysdate,add_months(sysdate,1) from dual; 一个月后的现在

select sysdate,add_months(sysdate,12) from dual; 一年后

select sysdate,add_months(sysdate,-12) from dual; 一年前

✨✨ 2.1.5 next_day 下一周开始计算

select next_day(sysdate,2) from dual;

✨✨ 2.1.6 last_day 某月最后一天

select sysdate,last_day(sysdate) from dual;

✨✨ 2.1.7 round 对日期四舍五入

select sysdate,round(sysdate) from dual;

select sysdate,round(sysdate,‘mi’) from dual;

select sysdate,round(sysdate,‘DD’) from dual;

✨✨ 2.1.8 trunc 对日期取整

select sysdate,trunc(sysdate) from dual;

select sysdate,trunc(sysdate,‘dd’) from dual; 今天零点

select sysdate,trunc(sysdate,‘mm’) from dual; 本月的第一天

select sysdate,trunc(sysdate,‘yyyy’) from dual; 今年的第一天

select to_char(add_months(last_day(sysdate))) from dual

select add_months(last_day(sysdate)+1,-2) from dual --上月月初

select last_day(add_months(last_day(sysdate)+1,-2)) from dual --上月月末

select add_months(last_day(sysdate)+1,-3) from dual --上上月月初

select last_day(add_months(last_day(sysdate)+1,-3)) from dual --上上月月末

select add_months(last_day(sysdate)+1,-4) from dual --上上上月月初

select last_day(add_months(last_day(sysdate)+1,-4)) from dual --上上上月月末

select add_months(trunc(sysdate,‘q’),-3) from dual --上个季度第一天

select trunc(sysdate,‘q’)-1 from dual --上个季度最后一天

select trunc(sysdate,‘yyyy’)-interval’2’YEAR from dual --前年年初

select trunc(sysdate,‘yyyy’)-interval’1’YEAR -1 from dual --前年年底

select trunc(sysdate,‘yyyy’)-interval’1’YEAR from dual --去年年初

select trunc(sysdate,‘yyyy’)-1 from dual --去年年末

🌈 2.2.连续的日期

–天别连续

select to_char(sysdate-8 + rownum - 1, ‘yyyymmdd’) as day

from dual

connect by

to_date(to_char(sysdate-8,‘yyyymmdd’),‘yyyymmdd’)+ rownum - 1

<= trunc(sysdate)

–月别连续

select to_char(add_months(add_months(sysdate,-2), rownum - 1), ‘yyyymm’) as month from dual

connect by add_months(add_months(sysdate,-2), rownum - 1) <= trunc(sysdate, ‘mm’)

–周别连续

SELECT

substr(TO_CHAR( TO_DATE(to_char(sysdate,‘YYYY-MM-DD’), ‘YYYY-MM-DD’)-21 + (ROWNUM - 1) * 7,‘iyyyiw’),-2)||‘W’ AS WEEK

FROM DUAL CONNECT BY ROWNUM <=3

奇淫巧技,难缠的日期处理大全,真香
奇淫巧技,难缠的日期处理大全,真香
奇淫巧技,难缠的日期处理大全,真香

🌈 2.3.区间日期

生成年份列表

select 1949 + rownum - 1 as year

from dual

connect by 1949 + rownum - 1 <= to_char(sysdate, ‘yyyy’)

order by year desc

生成月份列表

select to_char(add_months(to_date(‘2000-01’,‘yyyy-mm’), rownum - 1), ‘yyyymm’) as month

from dual

connect by add_months(to_date(‘2000-01’,‘yyyy-mm’), rownum - 1) <= trunc(sysdate, ‘mm’)

order by month desc

生成天列表

select to_char(to_date(‘2007-12-01’,‘yyyy-mm-dd’) + rownum - 1, ‘yyyymmdd’) as day

from dual

connect by to_date(‘2007-12-01’,‘yyyy-mm-dd’) + rownum - 1 <= trunc(sysdate)

order by day desc

生成小时列表

select to_char(to_date(‘2007-12-27’,‘yyyy-mm-dd’) + (rownum - 1) / 24, ‘yyyymmddhh24’) as hour

from dual

connect by to_date(‘2007-12-27’,‘yyyy-mm-dd’) + (rownum - 1) / 24 <=

trunc(sysdate,‘hh24’)

order by hour desc

🚀 3.java

🌈 3.1.常用日期设置

public class demo2 {
  public static void main(String[] args) {
    //Calendar类是一个单例模式的类,他的构造方法私有且不可被实例化
    //getInstance是类内部的一个静态方法,用来返回当前实例
    Calendar calendar1=Calendar.getInstance();
    Calendar calendar2=Calendar.getInstance();
    Calendar calendar3=Calendar.getInstance();
    //2019-08-10 14:13 正常日期格式  yyyy-MM-dd HH:mm:ss
    //将日期追加一天
    //DAY_OF_MONTH是类内部的变量,还有年,月,日等相应的变量,可以到IDE内部进行具体查看
    calendar2.add(Calendar.DAY_OF_MONTH, 1);
    //将日期减去三天
    calendar3.add(Calendar.DAY_OF_MONTH, -3);
    //设置日期格式
    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //得到的日期数据进行字符串转化
    String sd=df.format(calendar1.getTime()); 
    String sd1=df.format(calendar2.getTime());
    String sd2=df.format(calendar3.getTime());//日期格式化
    String sd3=df.format(new date());  //获取当前系统时间
    System.out.println(sd);
    System.out.println(sd1);
    System.out.println(sd2);
    //时间的比较 after比较c1是否在c3后面
    //before c1是否比c3早
    Boolean bo=calendar1.after(calendar3);
    System.out.println(bo);
  }
}      

🌈 3.2.年/月/周/天

Calendar cal=Calendar.getInstance();
cal.add(Calendar.DATE, -1)
cal.get(Calendar.YEAR)  --年份
cal.get(Calendar.MONTH)  --月度
cal.get(Calendar.DAY_OF_MONTH)  --天别
cal.get(Calendar.WEEK_OF_YEAR)  --周别