目录
显示当前日期
显示当前的时间戳
计算若干天之后的日期
计算每一位员工到今天为止的雇佣天数
计算两个日期间所经历的月数总和
计算每一位员工到今天为止的雇佣总月数
计算每一位员工到今天为止所雇佣的年限
增加若干月之后的日期
测试 add_months() 函数
查询所有雇佣满 34 年的员工信息
计算指定日期所在月的最后一天
计算当前日期所在月的最后一天
查询所有在雇佣所在月倒数第二天被雇佣的员工信息
计算下一个指定的日期
计算下一个周二的日期
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
日期函数主要对日期进行处理,但是在整个日期处理过程中会存在一个关键的问题:如何取得当前的日期。为此在 Oracle 中专门提供一个数据伪列,这个列不存在于表中,但是却可以像表的列一样进行查询,这个伪列就是 sysdate
SQL> select ename, hiredate, sysdate
2 from emp;
ENAME HIREDATE SYSDATE
-------------------- -------------- --------------
SMITH 17-12月-80 02-2月 -24
ALLEN 20-2月 -81 02-2月 -24
WARD 22-2月 -81 02-2月 -24
JONES 02-4月 -81 02-2月 -24
MARTIN 28-9月 -81 02-2月 -24
BLAKE 01-5月 -81 02-2月 -24
CLARK 09-6月 -81 02-2月 -24
KING 17-11月-81 02-2月 -24
TURNER 08-9月 -81 02-2月 -24
JAMES 03-12月-81 02-2月 -24
FORD 03-12月-81 02-2月 -24
尽管 emp 数据表中并没有字段 sysdate,但仍然可以看到 sysdate按照列的形式出现,显示当前日期
如果只想单独取得日期,可以简单一些,直接利用 dual 虚拟表即可
systimestamp显示当前的时间戳
Oracle 对于日期时间提供以下 3 种计算模式
日期 + 数字 = 日期(若干天之后的日期)
日期 - 数字 = 日期(若干天之前的日期)
日期 - 日期 = 数字(两个日期间的天数)
SQL> select sysdate+10, sysdate+120, sysdate+9999
2 from dual;
SYSDATE+10 SYSDATE+120 SYSDATE+9999
-------------- -------------- --------------
12-2月 -24 01-6月 -24 19-6月 -51
都是当前时间加多少天
在进行日期与数字的计算时,得到的结果都是比较容易理解的,因为结果仍然是一个日期。下面看 一下日期与日期之间相减是什么结果
SQL> select ename,hiredate,sysdate-hiredate
2 from emp;
ENAME HIREDATE SYSDATE-HIREDATE
-------------------- -------------- ----------------
SMITH 17-12月-80 15752.9303
ALLEN 20-2月 -81 15687.9303
WARD 22-2月 -81 15685.9303
JONES 02-4月 -81 15646.9303
MARTIN 28-9月 -81 15467.9303
BLAKE 01-5月 -81 15617.9303
CLARK 09-6月 -81 15578.9303
KING 17-11月-81 15417.9303
TURNER 08-9月 -81 15487.9303
JAMES 03-12月-81 15401.9303
FORD 03-12月-81 15401.9303
通过以上结果发现,依靠天数实际上很难得到准确的年数或者月数,因为结果有若干位小数。例如 上面结果中“15752.9303”表示两者之间相差的天数还有小数点,由于存在闰年和闰月等影响的因素,很难确定这些天究竟是多少年或多少月
为了可以精确地进行计算,Oracle 提供了日期处理函数。利用这些函数可以避免闰年或闰月的问题
months_between( 日期 1,日期 2)
SQL> select ename, hiredate,months_between(sysdate,hiredate)
2 from emp;
ENAME HIREDATE MONTHS_BETWEEN(SYSDATE,HIREDATE)
-------------------- -------------- --------------------------------
SMITH 17-12月-80 517.546258
ALLEN 20-2月 -81 515.449484
WARD 22-2月 -81 515.384968
JONES 02-4月 -81 514
MARTIN 28-9月 -81 508.19142
BLAKE 01-5月 -81 513.062387
CLARK 09-6月 -81 511.804323
KING 17-11月-81 506.546258
TURNER 08-9月 -81 508.836581
JAMES 03-12月-81 505.997871
FORD 03-12月-81 505.997871
有了月的数据,就可以准确计算年了。任何年份都只有 12 个月,这个是固定的
SQL> select ename,hiredate,trunc(months_between(sysdate,hiredate)/12) years
2 from emp;
ENAME HIREDATE YEARS
-------------------- -------------- ----------
SMITH 17-12月-80 43
ALLEN 20-2月 -81 42
WARD 22-2月 -81 42
JONES 02-4月 -81 42
MARTIN 28-9月 -81 42
BLAKE 01-5月 -81 42
CLARK 09-6月 -81 42
KING 17-11月-81 42
TURNER 08-9月 -81 42
JAMES 03-12月-81 42
FORD 03-12月-81 42
add_months( 日期,月数 )
函数运行结果返回对指定日期增加若干月之后的日期
SQL> select add_months(sysdate,4),add_months(sysdate,24),add_months(sysdate,300)
2 from dual;
ADD_MONTHS(SYS ADD_MONTHS(SYS ADD_MONTHS(SYS
-------------- -------------- --------------
02-6月 -24 02-2月 -26 02-2月 -49
利用这种方式计算时间可以避免闰年、闰月的问题
select *
from emp
where trunc(months_between(sysdate,hiredate)/12)=34;
大家可以自己试下是什么结果
last_day( 日期 )
SQL> select last_day(sysdate)
2 from dual;
LAST_DAY(SYSDA
--------------
29-2月 -24
每个员工的雇佣日期是不一样的,所以每一个雇佣日期所在月的倒数第二天也不一样。首先应该知道每一位员工雇佣月的最后一天,而后利用 “日期 - 数字 = 日期” ,计算出倒数第二天
SQL> select ename,hiredate,last_day(hiredate),last_day(hiredate)-2
2 from emp
3 where last_day(hiredate)-2=hiredate;
ENAME HIREDATE LAST_DAY(HIRED LAST_DAY(HIRED
-------------------- -------------- -------------- --------------
MARTIN 28-9月 -81 30-9月 -81 28-9月 -81
next_day( 日期,一周时间数 )
SQL> select next_day(sysdate,'星期二')
2 from dual;
NEXT_DAY(SYSDA
--------------
06-2月 -24