目录
查询员工的编号、姓名、雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数、月数、天数
计算出年
计算月
计算天数
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
查询员工的编号、姓名、雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数、月数、天数
对于本查询而言,由于日期的跨度较长 ,所以要想准确地计算出结果,必须结合日期函数
计算出年
如果要计算年,按照月来计算是比较准确的,那么一定要使用 months_between() 函数进行月 的计算,而后除以 12 就是年
SQL> select empno,ename,hiredate,trunc(months_between(sysdate,hiredate)/12) year2 from emp;EMPNO ENAME HIREDATE YEAR
---------- -------------------- -------------- ----------7369 SMITH 17-12月-80 437499 ALLEN 20-2月 -81 427521 WARD 22-2月 -81 427566 JONES 02-4月 -81 427654 MARTIN 28-9月 -81 427698 BLAKE 01-5月 -81 427782 CLARK 09-6月 -81 427839 KING 17-11月-81 427844 TURNER 08-9月 -81 427900 JAMES 03-12月-81 427902 FORD 03-12月-81 42
计算月
年的计算结果包含余数,余数实际上就是除 12 的结果,也就是月数。利用 mod() 函数可以求出余数
SQL> select empno,ename,hiredate,2 trunc(months_between(sysdate,hiredate)/12) year,3 trunc(mod(months_between(sysdate,hiredate),12)) months4 from emp;EMPNO ENAME HIREDATE YEAR MONTHS
---------- -------------------- -------------- ---------- ----------7369 SMITH 17-12月-80 43 17499 ALLEN 20-2月 -81 42 117521 WARD 22-2月 -81 42 117566 JONES 02-4月 -81 42 107654 MARTIN 28-9月 -81 42 47698 BLAKE 01-5月 -81 42 97782 CLARK 09-6月 -81 42 87839 KING 17-11月-81 42 27844 TURNER 08-9月 -81 42 57900 JAMES 03-12月-81 42 27902 FORD 03-12月-81 42 2
计算天数
现在所知道的计算天数的操作只有一个公式: “日期 1 - 日期 2 = 数字(天数) ” 。于是现在的问题 就集中在了日期的内容上
● 日期 1,一定是当前日期,使用 sysdate伪列
● 日期 2,实际上已经可以利用 months_between() 函数求出两个日期之间的月数
SQL> select empno,ename,hiredate,2 trunc(months_between(sysdate,hiredate)/12) year,3 trunc(mod(months_between(sysdate,hiredate),12)) months,4 trunc(sysdate-add_months(hiredate,months_between(sysdate,hiredate))) day5 from emp;EMPNO ENAME HIREDATE YEAR MONTHS DAY
---------- -------------------- -------------- ---------- ---------- ----------7369 SMITH 17-12月-80 43 1 277499 ALLEN 20-2月 -81 42 11 247521 WARD 22-2月 -81 42 11 227566 JONES 02-4月 -81 42 10 117654 MARTIN 28-9月 -81 42 4 167698 BLAKE 01-5月 -81 42 9 127782 CLARK 09-6月 -81 42 8 47839 KING 17-11月-81 42 2 277844 TURNER 08-9月 -81 42 5 57900 JAMES 03-12月-81 42 2 107902 FORD 03-12月-81 42 2 10
假设现在需要截取数据表中每个姓名的后三个字母,常用的做法如下。
首先一定要确认截取的开始点,每个姓名的长度不一样,所以开始点也不同。此时 最好的做法是使用 length() 来计算长度
SQL> select ename,substr(ename,length(ename)-2)2 from emp;ENAME SUBSTR(ENAME,LENGTH(ENAME)-2)
-------------------- --------------------------------------------------------------------------------
SMITH ITH
ALLEN LEN
WARD ARD
JONES NES
MARTIN TIN
BLAKE AKE
CLARK ARK
KING ING
TURNER NER
JAMES MES
FORD ORD
但是 substr() 可以设置负数索引,表示从后向前数
SQL> select ename,substr(ename,-3)2 from emp;ENAME SUBSTR(ENAME,-3)
-------------------- ------------------------
SMITH ITH
ALLEN LEN
WARD ARD
JONES NES
MARTIN TIN
BLAKE AKE
CLARK ARK
KING ING
TURNER NER
JAMES MES
FORD ORD