一、日期操作
1.数据库日期类型
date:数据库常用的日期类型,可以存储年月日时分秒默认格式
dd-mon-rr,占用7个字节
第一个字节:存的是 值+100
第二个字节:存的是 年 yyyy\yy
第三个字节:存的是 月 MM
第四个字节:存的是 天 dd
第五个字节:存的是 时 hh,hh12\hh24
第六个字节:存的是 分 mm
第七个字节:存的是 秒 ss
timestamp:时间戳类型
与date类型相似,可以精确到纳秒级别
最多占用11个字节,从前七个字节与date一致
从第八个到第十一个字节都是存储的
2.关键字
sysdate:返回的是当前系统时间,年月日时分秒
systimestamp:返回的是当前系统时间,可以精确到毫秒
eg:
drop table temp_12;
create table temp_12(
t1 date,
t2 timestamp
);
insert into temp_12 values(sysdate,systimestamp);
select * from temp_12;
3.日期操作函数
(1)函数:日期类型转换成字符串类型
--格式:to_char(p1,p2),将日期p1,按照p2的格式转换成字符串类型
--练习:查询temp_12表,使日期按照'yyyy-MM-dd HH-mm-ss'的格式显示
select to_char(t1,'yyyy-MM-dd HH-mm-ss'),to_char(t2,'yyyy-MM-dd HH-mm-ss') from temp_12;
(2)函数:字符串类型转换成日期类型
--格式:to_date(p1,p2),将字符串p1,按照p2的格式转换成日期类型
--练习:插入一条数据,t1为自己的出生日期,t2为2016年8月31日上午9点30分25秒
insert into temp_12 values(to_date('1996-12-18 ','yyyy-MM-dd'),
to_date('2016-8-31 09:30:25','yyyy-MM-dd hh:mi:ss'));
--练习:查询所有员工的入职日期,格式如下:xx日xx月xx年
select to_char(hiredate,'dd"日"MM"月"yyyy"年"') from emp;
(3)函数:查看当前月份的最后一天日期
--格式:last_day(p1):查看p1中的月份的最后一天的日期
--练习:查询当前系统时间的月份的最后一天
select last_day(sysdate) from dual;
(4)函数:在当前日期加上n个月,返回n个月后的日期
--格式:add_months(p,n),在日期p的基础上加上n个月,返回的n个月的日期
-- n可以为小数,会截取到整数进行增加,可以为负数
--练习:推算2017年1月31日的一个月后的日期
select add_months(to_date('2017-01-31','yyyy-MM-dd'),1) as 推算的日期 from dual;
--练习:推算当前系统时间的前两个月的日期
select add_months(sysdate,-2) as 推算的日期 from dual;
(5)函数:计算两个日期间相差的天数
--格式:months_between(p1,p2),计算两个日期p1和p2之间相差的月份,会存在小数的情况
--练习:计算出生日期和当前系统时间的差
select months_between(sysdate,to_date('1996-12-18','yyyy-MM-dd')) from dual;
(6)函数:计算下个周几的日期
--格式:next_day(date,num),表示查看参数date的下一个周几的日期
-- date:某一日期,num:范围为1-7,表示周日到周六
--练习:查看当前系统时间的下一个周日的日期
select to_char(next_day(sysdate,1),'yyyy-mm-dd') "日期" from dual;
--练习:查看生产日期'2016-10-10'的一个月后的下一个周六的促销日期
select next_day(add_months(to_date('2016-10-10','yyyy-mm-dd'),1),7) "促销日" from dual;
(7)函数:比较多个日期的最小日期,最大日期
--格式:least(p1,p2,p3,...........)
-- 多个参数比较,求出最小的,要求参数为同一类型,或者可以默认转换成第一个参数的类型
--格式:greatest(p1,p2,p3,...........)
-- 多个参数比较,求出最大的,要求参数为同一类型,或者可以默认转换成第一个参数的类型
--练习:计算当前系统时间,澳门回归日期,香港回归日期的最小日期,和最大的日期
select least(sysdate,to_date('1999-12-20','yyyy-mm-dd'),to_date('1997-07-01','yyyy-mm-dd')) from dual;
--练习:统计3,2,1,4,5,中最小值和最大值
select least(1,2,3,4,5) "min",greatest(1,2,3,4,5) "max" from dual;
--练习::统计'33',1,2,5,4,'a',中最小值和最大值
select least('33',2,1,4,5,'a') "min",greatest('33',2,1,4,5,'a') "max" from dual;
--字符串比较大小,是从比较字符的ASCII码,从左开始比较
--练习:比较多个日期的最大值
select greatest(sysdate,to_date('1999-12-20','yyyy-mm-dd'),to_date('1997-07-01','yyyy-mm-dd')) from dual;
(8)函数:从当前日期中提取分量值
--格式:extract(p1 from p2),表示从日期p2中提取分量p1
-- 日期分量
-- year,month,day,hour,minute,second
-- 日期类型关键字sysdate,systimestamp
--练习:分别从日期类型的关键字中提取分量
select extract(year from sysdate) year,extract(month from sysdate) month,extract(day from sysdate) day from dual;
select extract(year from systimestamp),extract(month from systimestamp),extract(day from systimestamp),
extract(hour from systimestamp),extract(minute from systimestamp),extract(second from systimestamp) from dual;
--可以从sysdate中提取年月日,可以从systimestamp中提取年月日时分秒