在linux系统中,你可以直接使用命令date查看当前操作系统的时间。例如:

--在UOS中,这样显示
ywbaoyw@xxx@baoyw-b:~/Desktop$ date
2024年 01月 09日 星期二 11:18:10 CST
ywbaoyw@xxx@baoyw-b:~/Desktop$
--在Linux中,这样显示
[root@oracle-baoyw]# date
Tue Jan 9 11:19:49 CTS 2024
[root@oracle-baoyw]#

这里,我们不讨论时区,也不讨论如何设置时间,只说说date在Oracle数据库中的取值操作。在Oracle中,我们取 sysdate。以下的例子中,通过 sysdate 来显示不同的时间。

sysdate

--当前时间 日-月-年
SQL> select sysdate from dual;

SYSDATE
---------
09-JAN-24
--当前时间 格式化 年-月-日 时:分:秒
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2024-01-09 11:23:39
--24小时之前
SQL> select to_char(sysdate-1,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE-1,'
-------------------
2024-01-08 11:24:39
--12小时之前
SQL> select to_char(sysdate-1/2,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE-1/2
-------------------
2024-01-08 23:25:20
--6小时之前
SQL> select to_char(sysdate-1/4,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE-1/4
-------------------
2024-01-09 05:25:46
--2小时之前
SQL> select to_char(sysdate-2/24,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE-2/2
-------------------
2024-01-09 09:26:23
--1小时之前
SQL> select to_char(sysdate-1/24,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE-1/2
-------------------
2024-01-09 10:27:03
--半小时之前
SQL> select to_char(sysdate-1/24/2,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE-1/2
-------------------
2024-01-09 10:57:49

那么,有了以上的取值,我们在做其他操作时,就可以直接套用了。这里需要注意的是,如果用了 trunc() ,取值将不同。

trunc(),用于截取时间或者数值,返回指定的值。

数值处理语法格式:trunc(number,[decimals])

number:必要参数,是输入的一个数值。

decimals:可忽略参数,是要截取的位数;缺省时表示截掉小数点后的面值。

日期处理语法格式:trunc(date,[format])

date:必要参数,是输入的一个date日期值。

format:可忽略参数,是日期格式。

format 常用取值:

  • 缺省:获取当前年月日:如:2024/1/9 00:00:00
  • y或yy或yyy或yyyy或year:获取今天的一月一日:如:2024/1/1
  • 'mm'或'month':获取当月的第一天:如:2024/1/1
  • 'q':获取本星期的第一天【是周日而不是周一】
  • 'hh':获取当前的小时:如:2024/1/9 15:00:00
  • 'mi':获取当前的时分:如:2024/1/9 15:22:00

所以,当我们使用 trunc() 来截取时间时,与实际时间不同。

trunc()

--当前时间 格式化 年-月-日 时:分:秒
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2024-01-09 11:23:39

--当前时间
SQL> select to_char(trunc(sysdate),'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE-1/2
-------------------
2024-01-09 00:00:00

灵活运用。假如,你的归档快满了,你要删除一段时间的,那么可以这样操作:

delete archivelog

--删除前一天23点之前的所有归档日志
delete archivelog all completed before 'trunc(sysdate-1)+23/24';

--删除的归档日志,直到time,无提示(noprompt)
--删除0.5小时之前的归档 
RMAN> delete noprompt archivelog until 'sysdate-1/24/2' like '+ARCH/%';

--删除1小时之前的归档
RMAN> delete noprompt archivelog until time 'sysdate-1/24' like '+ARCH/%';

--删除6小时之前的归档
RMAN> delete noprompt archivelog until time 'sysdate-1/4' like '+ARCH/%';

--删除1天之前的归档
RMAN> delete noprompt archivelog until time 'sysdate-1' like '+ARCH/%';