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