如何比较 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
);
我需要显示最老员工和最后一名员工的姓名,因此我需要比较 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
);