目录
查询员工的编号、姓名、雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数、月数、天数
计算出年
计算月
计算天数
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