Oracle SQL,如何使用当前日期和指定日期?

7
获取当前日期,我使用以下方法...
select extract(year from sysdate) from dual;

为了获取我的数据库持有的日期,我使用以下代码:
select extract(year from startdate) from staff;

现在我想通过使用当前年份减去开始日期的年份,来更新员工信息中的服务年限字段(serviceYears),以获取员工已经承诺工作的年数。请问如何实现?

我正在使用Oracle SQL。

谢谢!

我已尝试使用

SQL> select dual.sysdate-staff.startdatefrom dual,staff;

select dual.sysdate-staff.startdatefrom from dual,staff
            *
ERROR at line 1:
ORA-01747: invalid user.table.column, table.column, or column specification

我也尝试过。
select SYSDATE-to_date('01-jan-2007','dd-mon-yyyy') from dual;

But it return me
SYSDATE-TO_DATE('01-JAN-2007','DD-MON-YYYY')
--------------------------------------------
                                  2136.93719

我该如何仅获取年份?


1
“serviceYears” 应该是一个整数吗?例如,如果员工已经工作了6年1个月,您想要什么?那么如果是6年11个月呢?此外,将其作为视图/虚拟列会更好,因为数据需要一直维护,否则会出现问题。 - DazzaL
5个回答

10

你可以做到这一点

UPDATE STAFF
SET serviceYear = ROUND((sysdate - startDate)/365)

例子:

select ROUND((sysdate - to_date('01-JAN-2007','DD-MON-YYYY'))/365) 
from dual; -- returns 6


select ROUND((sysdate - to_date('01-JAN-2005','DD-MON-YYYY'))/365,2) 
from dual; -- returns 7.85

更新:

SELECT 
FLOOR((SYSDATE - TO_DATE('01-JAN-2005','DD-MON-YYYY'))/365) YEARDOWN,
CEIL((SYSDATE - TO_DATE('01-JAN-2005','DD-MON-YYYY'))/365) YearUP
FROM DUAL;

如何进行向下取整,因为我看到有些工人是从2005年开始工作的,但计算服务年限却只算8年,而现在是2012年。例如,此startDate为01-JAN-05,但服务年限为8。 - user1777711
不太喜欢根据工作天数来计算工作年限,我认为使用months_between()会是更好的选择。 - David Aldridge

1

我认为你最好使用 FLOORMONTHS_BETWEEN 的组合。

SQL> CREATE TABLE t (start_date DATE);

Table created.

SQL> INSERT INTO t VALUES (TO_DATE('20070930','YYYYMMDD'));

1 row created.

SQL> SELECT FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE), start_date)/12) yrs_between_start_dt_and_today FROM t
  2  ;

YRS_BETWEEN_START_DT_AND_TODAY
------------------------------
                             5

SQL>

您可以根据需要调整四舍五入。此外,与硬编码的365相比,此解决方案在闰年等方面表现更好。


是的,对于基于月份的解决方案加1。 - David Aldridge

1

你不需要使用 dual.sysdate - 直接引用 sysdate 即可。

select sysdate-staff.startdatefrom from staff

我该如何以年为单位获得答案 :) - user1777711
这将是以天为单位 - 因此您可以除以365来获得(小数)年。然后您可以四舍五入。 - Randy

0

-1
    SELECT extract(year from sysdate)-extract(year from TDATE) 
      FROM R_M 
CONNECT BY LEVEL <=1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接