日期操作
------TIMESTAMP 时间戳
-oracle常用的日期类型
-与DATE的区别是不仅可以保存日期和时间,还能保存小数秒,最高精度可以到ns(纳秒)
-数据库内部用7或者11个字节存储,精度为0,用7字节存储,与DATE功能相同,精度大于0则用11字节存储。
格式为:
---第1字节-第7字节:和DATE相同
---第8-11字节:纳秒,采用4个字节存储,内部运算类型为整型
-------SYSDATE
其本质是一个oracle的内部函数,返回当前的系统时间,精确到秒;
默认显示格式是DD-MON-RR;
------SYSTIMESTAMP
内部函数,返回当前系统日期和时间,精确到毫秒
-----TO_DATE 将字符串格式的内容转换成DATE格式的日期
select to_date('2018-3-15 10:02:30' , 'YYYY-MM-DD HH:MI:SS') FROM DUAL; //转换前后的格式需要一致,否则报错
在日期格式字符串中凡不是英文,符号,数字的其他字符,都需要使用双引号括起来。
select to_Date('2018年3那15黑','YYYY"年"MM"那"DD"黑"') from dual; //只要里面的文字匹配一致,日期照样可以转换成功
日期的计算
日期可以与一个数字进行加减法,这相当于加减指定的天。
两个日期可以进行减法,差为相差的天。
查看每个员工至今入职多少天了?
select ename, sysdate-hiredate from emp;TO_CHAR( ) : 可以将DATE按照给定的格式转换成字符串
select to_char(SYSDATE, 'YYYY-MM-DD HH24:MI:SS' ) FROM DUAL;
日期格式当中YY是完全按照当前的系统时间来判断的;
而RR是以下列图中的判定机制来实现的;
例如:
select to_char(to_date('49-07-12' ,'RR-MM-DD'),'YYYY-MM-DD') from dual; 表示的是本世纪的49年,即2049
在以上的图表中,SYS是表示当前系统的年份,例如当前2018年,那么18是在0-49之间,所以SYS选择的是本世纪,上世纪;
而当前用户若给了一个50年,那么50是在user的50-99之间,选择的是上世纪,本世纪。
那么两者交叉后的一个选项结果是上世纪50年代。
LAST_DAY
--LAST_DAY(date) 返回给定日期所在月的月底日期
例如:查看当前月底日期?
select last_day(sysdate) from dual;
ADD_MONTHS(date , i)
对给定日期加上指定的月,若i为负数则是减去。
例如:查看每个员工入职20周年纪念日?
select ename,add_months(hiredate,12*20) from emp;
MONTHS_BETWEEN(date1 , date2)
计算date1和date2之间相差的月,根据date1 - date2得到的;
例如:查看每个员工至今入职多少个月了?
select ename, months_between(sysdate,hiredate) from emp;
NEXT_DAY
--NEXT_DAY(date, char) :返回date日期数据的下一个周几,周几是由参数char来决定的。
返回给定日期的第二天开始一周之内的指定周几的日期。 1表示周日,2表示周一,以此类推。
--在中文环境下,直接使用“星期三”这种形式,英文环境下,需要使用“wednesday”这种英文的周几。为了避免麻烦,可以直接用数字1-7表示周日到周六。
--NEXT_DAY不是明天!!
LEAST, GREATEST
求最小值与最大值,除了日期外,常用的数字也可以比较大小。
select least(sysdate,to_date('2018-03-04','YYYY-MM-DD')) from dual;
EXTRACT(date from datetime) 提取给定日期中指定时间分量的值
从emp表中查询1980年入职的员工??
select ename,hiredate from emp where extract(year from sysdate)=1980;