日期函数
1.日期类型
1)date:数据库中常用的日期类型,可以存储年月日时分秒
默认格式:yy-mon-dd date'yy-mon-dd'
一共占用了7个字节,第一个字节存的是 世纪,(应该加上100)
第二个字节存的是 年,
第三个字节存的是 月,
第四个字节存的是 日,
第五个字节存的是 时,
第六个字节存的是 分,
第七个字节存的是 秒。
2)timestamp:时间戳类型
默认格式:yy-mon-dd hh:mi:ss
与date类型相似,可以精确到纳秒。
最多可以占用11个字节,前七个字节与date一致,从8到11个字节,存储的时精确度。
--2015-12-11可以转换为date和timestamp类型
select date'2015-12-11' from dual;
select timestamp'2015-12-11 1:12:50' from dual;
2.当前系统时间关键字
sysdate:返回的时当前系统时间,年月日时分秒
systimestamp:返回的是当前系统时间,可以精确到毫秒
--分别使用sysdate和systimestamp调用当前系统时间
select sysdate,systimestamp from dual;
3.日期之间的加减法:
日期类型+1表示增加一天
日期类型-1表示减少一天
--为当前时间增加增加一年
select add_months(sysdate,12) from dual;
--为当前时间增加一月
select add_months(sysdate,1) from dual;
--为当前时间增加一天
select sysdate+1 from dual;
--为当前时间增加一小时
select sysdate+1/24 from dual;
--为当前时间增加一分钟
select sysdate+1/24/60 from dual;
--为当前时间增加一秒钟
select sysdate+1/24/60/60 from dual;
4.日期函数:
1)to_char(time,string)/to_date(time,string)
to_char(time,string):将日期time按照string的格式转换成字符串类型(time为日期类型,string为字符串类型)
to_date(time,string):将字符串类型time(string的格式)转换成日期类型(time,string均为字符串类型)
字符串格式:
YYYY/YY:年
MM:月
DD:日(当月第几天)
HH24/HH:表示24/12小时制
MI:表示分钟
SS:表示秒
AM:表示上下午
day/dy:表示星期
ww:该年的第几个星期
w:该月的第几个星期
d:表示一周的第几天
ddd:表示当年的第几天
如果格式中带有汉字,汉字必须用""引起来。
--将当前时间改"yyyy年mm月dd hh-mi-ss";
select to_char(sysdate,'yyyy"年"mm"月"dd hh-mi-ss') from dual;
--将自己的生日改为日期类型
select to_date('1997年12月11','yyyy"年"mm"月"dd') from dual;
2)last_day(time):
作用:查看time月份中的最后一天
--查看当前时间的最后一天
select last_day(sysdate) from dual;
--查看生日的月份的最后一天
select last_day(to_date('1997-12-11','yyyy-mm-dd')) from dual;
3)next_day(date,num);
作用:返回date(日期类型)的下一个周num的日期
num:从1到7表示周日到周六
(注意:如果当前时间是星期一,那么下一个周二(next_day(sysdate,3))就是明天)
--查看当前时间的下一个周日的日期
select next_day(sysdate,1) from dual;
--查看生日的下一个周日的日期
select next_day(to_date('1997-12-11','yyyy-mm-dd'),5) from dual;
4)add_months(time,n):
作用:在日期p1的基础上增加n个月,返回n个月后的日期
n可以为小数(会截取到整数进行运算),也可以为负数(向前推进n个月)
--查看当前时间的前5个月的日子
select add_months(sysdate,-5) from dual;
--查看生日的后12.5个月
select add_months(to_date('1997-12-11','yyyy-mm-dd'),12.5) from dual;
5)months_between(time1,time2)
作用:计算time2到time1一共过了多少个月,会存在小数和负数的情况
--计算当前时间和生日相差的月月数
select months_between(sysdate,to_date('1997-12-11','yyyy-mm-dd')) from dual;
6)extract(分量 from time)
作用:从日期time中提取分量
分量:包括year(年)、month(月)、day(日)、hour(小时)、minute(分钟)、second(秒)
(extract可以从date类型数据中分离出year、hour、minute,
timestamp类型日期中分离出year、hour、day、hour、minute、second)
--使用关键字extract从当前时间分离出年月日时分秒
select extract(year from sysdate) year,
extract(month from sysdate) month,
extract(day from sysdate) day,
extract(hour from systimestamp) hour,
extract(minute from systimestamp) minute,
extract(second from systimestamp) second from dual;
获取两个日期之间的具体时间间隔,extract函数是最好的选择
--计算当前日期与生日相差的天数
select extract(day from systimestamp-timestamp'1997-12-11 01:12:50') from dual;
--这是网上我所参考的一个人的数据
select extract(day from dt2-dt1) day
,extract(hour from dt2-dt1) hour
,extract(minute from dt2-dt1) minute
,extract(second from dt2-dt1) second
from (
select to_timestamp('2011-02-04 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1
,to_timestamp('2011-05-17 19:08:46','yyyy-mm-dd hh24:mi:ss') dt2
from dual)
5.得到一些日期的计算
--得到当前的日期
select sysdate from dual;
--得到当天凌晨0点0分0秒的日期
select to_char(trunc(sysdate),'yyyy-mm-dd hh24-mi-ss') from dual;
--得到当天的最后一秒
select to_char(trunc(sysdate)+0.99999,'yyyy-mm-dd hh24-mi-ss') from dual;
--得到本月1日的日期
select trunc(sysdate,'mm') from dual;
--得到一年的每一天
select trunc(sysdate,'yyyy')+rn-1 from
(select rownum rn from all_objects where rownum<366);
--判断某一日子所在年是否是闰年
select decode(to_char(last_day(add_months(trunc(sysdate,'yyyy'),1)),'dd'),'29','闰年','平年') from dual;