文章目录
- 前言
- 🚀 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) --周别