如何在Oracle SQL中从每个员工的雇用日期获得5年后的8月31日?[关闭]

b4qexyjb  于 2023-06-22  发布在  Oracle
关注(0)|答案(3)|浏览(148)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

9天前关闭
Improve this question
我有一个以Hire_date作为DATE字段的EMPLOYEES表。
如何在Oracle SQL中从每个员工的雇用日期起5年后获得8月31日?

bgibtngc

bgibtngc1#

如果日期+ 5年小于该年的8月31日,则取该年的8月31日,否则从下一年开始:

select id, hire_date, 
       case when add_months(trunc(hire_date+interval '5' year, 'year'), 8) - 1
                 >= hire_date + interval '5' year
            then add_months(trunc(hire_date+interval '5' year, 'year'), 8) - 1
            else add_months(trunc(hire_date+interval '6' year, 'year'), 8) - 1
       end aug31
from employees

dbfiddle demo

3htmauhk

3htmauhk2#

与Ponder的查询类似,但有些不同:将hiredate截断为该年1月1日,然后

  • 1 - 8月增加5
  • 9月至12月增加6

再减去一天。
解释看起来比查询本身更复杂。

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> select
  2    ename,
  3    hiredate,
  4    add_months(trunc(hiredate, 'yyyy'),
  5               12 * case when to_char(hiredate, 'mm') <= '08' then 5 else 6 end + 8
  6              ) - 1 result
  7  from emp
  8  order by hiredate;

ENAME      HIREDATE   RESULT
---------- ---------- ----------
SMITH      17.12.1980 31.08.1986
ALLEN      20.02.1981 31.08.1986
WARD       22.02.1981 31.08.1986
JONES      02.04.1981 31.08.1986
BLAKE      01.05.1981 31.08.1986
CLARK      09.06.1981 31.08.1986
TURNER     08.09.1981 31.08.1987
MARTIN     28.09.1981 31.08.1987
KING       17.11.1981 31.08.1987
JAMES      03.12.1981 31.08.1987
FORD       03.12.1981 31.08.1987
MILLER     23.01.1982 31.08.1987
SCOTT      09.12.1982 31.08.1988
ADAMS      12.01.1983 31.08.1988

14 rows selected.

SQL>
bprjcwpo

bprjcwpo3#

你可以在不使用CASE表达式的情况下完成它:
1.减去8个月(将前一年的8月31日改为12月31日);

  1. TRUNC将日期更改为年初(这会将所有日期更改为1月1日);
    1.重新添加之前减去的8个月(这将更改所有日期为前一年的9月1日);
    1.加上1年减去一天(这将把所有日期设置为当年的8月31日);和/或
    1.加5年。
    像这样:
SELECT name,
       hire_date,
       ADD_MONTHS(TRUNC(ADD_MONTHS(hire_date, -8), 'YY'), 80) - 1
         AS hire_date_plus_5_years
FROM   employees;

其中,对于样本数据:

CREATE TABLE employees (name, hire_date) AS
SELECT 'Alice', DATE '2020-08-31' FROM DUAL UNION ALL
SELECT 'Betty', DATE '2020-09-01' FROM DUAL UNION ALL
SELECT 'Carol', DATE '2020-01-01' FROM DUAL UNION ALL
SELECT 'Debra', DATE '2020-08-30' FROM DUAL;

输出:
| 名称|招聘日期|雇用_DATE_PLUS_5_年|
| - -----|- -----|- -----|
| 爱丽丝|2020-08-31 00:00:00| 2025-08-31 00:00:00|
| 贝蒂|2020-09-01 00:00:00| 2026-08-31 00:00:00|
| 卡罗尔|2020-01-01 00:00:00| 2025-08-31 00:00:00|
| 黛布拉|2020-08-30 00:00:00| 2025-08-31 00:00:00|
fiddle

相关问题