综合例题及补充

目录

查询员工的编号、姓名、雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数、月数、天数

计算出年

计算月

计算天数


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() 函数求出两个日期之间的月数

综合例题及补充_第1张图片 

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

你可能感兴趣的:(Oracle从小白到总裁,数据库,oracle,sql)