日期函数

目录

显示当前日期

显示当前的时间戳

计算若干天之后的日期

计算每一位员工到今天为止的雇佣天数

计算两个日期间所经历的月数总和

计算每一位员工到今天为止的雇佣总月数

计算每一位员工到今天为止所雇佣的年限

增加若干月之后的日期

测试 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( 日期,月数 )

函数运行结果返回对指定日期增加若干月之后的日期

测试 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

利用这种方式计算时间可以避免闰年、闰月的问题

查询所有雇佣满 34 年的员工信息

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

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