如何比较 sql oracle 中的两个日期时间

how to compare two datetime in sql oracle

我需要显示最老员工和最后一名员工的姓名,因此我需要比较 hire_date 的日期时间,这是我的尝试方法及其不工作:

SELECT ename
from emp
where hiredate = 'MIN(hiredate)' AND hiredate = 'MAX(hiredate)'; 

我该怎么办?

例如:

SQL> with minimax as
  2    (select min(hiredate) min_hiredate,
  3            max(hiredate) max_hiredate
  4     from emp
  5    )
  6  select e.ename, e.hiredate
  7  from emp e join minimax m on e.hiredate in (m.min_hiredate, m.max_hiredate);

ENAME      HIREDATE
---------- ----------
SMITH      17.12.1980
ADAMS      12.01.1983

SQL>

我会推荐 window 函数:

select *
from (
    select e.*,
        rank() over(order by hire_date) rn_asc,
        rank() over(order by hire_date desc) rn_desc
    from emp e
) e
where 1 in (rn_asc, rn_desc)

子查询通过增加和减少雇用日期对员工进行排名,外部查询选择顶部和底部记录。这允许联系,如果有的话。

可以使用 window 最小值和 window 最大值来实现相同的逻辑:

select *
from (
    select e.*,
        min(hire_date) over() min_hire_date,
        max(hire_date) over() max_hire_date
    from emp e
) e
where hire_date in (min_hire_date, max_hire_date)

在 Oracle 中,您可以使用“简单”聚合查询来完成此操作:

select max(ename) keep (dense_rank first order by hiredate asc) as oldest_employee,
       max(ename) keep (dense_rank first order by hiredate desc) as newest_employee
from emp;

如果您希望在不同的行上显示此信息,您也可以使用 union all

(select name, hiredate
 from emp
 order by hiredate
 fetch first 1 row only
) union all
(select name, hiredate
 from emp
 order by hiredate desc
 fetch first 1 row only
);