目录
查询员工的编号、姓名、雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数、月数、天数
计算出年
计算月
计算天数
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
对于本查询而言,由于日期的跨度较长 ,所以要想准确地计算出结果,必须结合日期函数
如果要计算年,按照月来计算是比较准确的,那么一定要使用 months_between() 函数进行月 的计算,而后除以 12 就是年
SQL> select empno,ename,hiredate,trunc(months_between(sysdate,hiredate)/12) year
2 from emp;
EMPNO ENAME HIREDATE YEAR
---------- -------------------- -------------- ----------
7369 SMITH 17-12月-80 43
7499 ALLEN 20-2月 -81 42
7521 WARD 22-2月 -81 42
7566 JONES 02-4月 -81 42
7654 MARTIN 28-9月 -81 42
7698 BLAKE 01-5月 -81 42
7782 CLARK 09-6月 -81 42
7839 KING 17-11月-81 42
7844 TURNER 08-9月 -81 42
7900 JAMES 03-12月-81 42
7902 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)) months
4 from emp;
EMPNO ENAME HIREDATE YEAR MONTHS
---------- -------------------- -------------- ---------- ----------
7369 SMITH 17-12月-80 43 1
7499 ALLEN 20-2月 -81 42 11
7521 WARD 22-2月 -81 42 11
7566 JONES 02-4月 -81 42 10
7654 MARTIN 28-9月 -81 42 4
7698 BLAKE 01-5月 -81 42 9
7782 CLARK 09-6月 -81 42 8
7839 KING 17-11月-81 42 2
7844 TURNER 08-9月 -81 42 5
7900 JAMES 03-12月-81 42 2
7902 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))) day
5 from emp;
EMPNO ENAME HIREDATE YEAR MONTHS DAY
---------- -------------------- -------------- ---------- ---------- ----------
7369 SMITH 17-12月-80 43 1 27
7499 ALLEN 20-2月 -81 42 11 24
7521 WARD 22-2月 -81 42 11 22
7566 JONES 02-4月 -81 42 10 11
7654 MARTIN 28-9月 -81 42 4 16
7698 BLAKE 01-5月 -81 42 9 12
7782 CLARK 09-6月 -81 42 8 4
7839 KING 17-11月-81 42 2 27
7844 TURNER 08-9月 -81 42 5 5
7900 JAMES 03-12月-81 42 2 10
7902 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