范例:查询出每个雇员的到今天为止的雇佣天数,以及十天前每天雇员的雇佣天数
SELECT empno 雇员编号, ename 雇员姓名, SYSDATE-hiredate 雇佣天数, (SYSDATE-10)-hiredate 10天前雇佣天数 FROM emp;结果有小数点,可以用 TRUNC() 截取小数点
SELECT empno 雇员编号, ename 雇员姓名, TRUNC(SYSDATE-hiredate) 雇佣天数, TRUNC((SYSDATE-10)-hiredate) 10天前雇佣天数 FROM emp;以上只是针对于当前时间的操作,对于 Oracle 而言,也提供相应的日期函数,之所以使用日期函数,主要是避免闰年问题,或者是一个月有28,29,30,31天的问题,通过日期函数的计算取得的日期时间是最准确的。
No.函数名称描述1 ADD_MONTHS(日期,数字) 在指定的日期上加入指定的月数,求出新的日期
2 MONTHS_BETWEEN(日期1,日期2) 求出两个日期间的雇佣月数
3 NEXT_DAY(日期,星期数) 求出下一个星期几的具体日期
4 LAST_DAY(日期) 求出指定日期所在月的最后一天日期
5 EXTRACT(格式 FROM 数据) 日期时间分隔,或计算给定两个日期的间隔
范例:验证 ADD_MONTHS() 函数
使用 ADD_MONTHS() 函数的主要功能是在一个指定日期上增加若干个月之后求得的新日期。
SELECT SYSDATE, ADD_MONTHS(SYSDATE,3) 三个月之后的日期, ADD_MONTHS(SYSDATE,-3) 三个月之前的日期, ADD_MONTHS(SYSDATE,60) 六十个月之后的日期, FROM dual;范例:要求显示所有雇员在被雇佣三个月之后的日期
SELECT empno,ename,job,sal,hiredate,ADD_MONTHS(hiredate,3) FROM emp;范例:验证 NEXT_DAY() 函数
主要是求出下一个指定的日期数,如果说现在的日期是‘2019年08月30日 星期五’ ,那么如果现在想要知道下一个‘星期一’ 或是 ‘星期日’ 的具体日期,则可以使用 NEXT_DAY() 函数。
SELECT SYSDATE, NEXT_DAY(SYSDATE,'星期日') 下一个星期日, NEXT_DAY(SYSDATE,'星期一') 下一个星期一 FROM dual;范例:LAST_DAY() 函数验证,求当月的最后一天
SELECT SYSDATE, LAST_DAY(SYSDATE) FROM dual;范例:查询所有是在其雇佣所在月的倒数第三天被公司雇佣的完整雇佣信息
每一位雇员都有自己的雇佣日期,那么现在要查询出,你雇佣日期所在月倒数第三天雇佣的人,首先需要知道的是每个雇员雇佣所在月的最后一天。
SELECT empno,ename,job,hiredate,LAST_DAY(hiredate) FROM emp WHERE LAST_DAY(hiredate)-2=hiredate;范例:MONTHS_BETWEEN() 函数的验证:查询出每个雇员的编号、姓名、雇员佣日期,雇佣的月数及年份
MONTHS_BETWEEN() 函数的功能是取得两个日期时间的月份间隔
SELECT empno 雇员编号, ename 雇员姓名, hiredate 雇佣日期, TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)) 雇佣总月数, TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 雇佣总年数 FROM emp;范例:查询出每个雇员的编号、姓名、雇佣日期、已雇佣的年数、月数、天数
对于本程序而言,一定是分步计算,而且有一定的难度,因为要操作的是准确性。
例如,今天的日期是 2019-09-01日,而 BLAKE 的雇佣日期是 1981-05-01,那么这位雇员到今天为止被雇佣了38年、4个月、0天。
步骤一:求出年,年只需要依靠月就可以计算出来。
SELECT empno 雇员编号, ename 雇员姓名, hiredate 雇佣日期, TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 雇佣总年数 FROM emp;步骤二:求出月,计算年的时候存在小数,那么这里面的数据就是月,只需要求模即可得到。
SELECT empno 雇员编号, ename 雇员姓名, hiredate 雇佣日期, TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) 已雇佣年数, TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) 已雇佣月数 FROM emp;