查找今天日期和一列日期之间的年数

Finding the length of years between todays date and a column of dates

我是 sql 的新手,所以这对你们中的一些人来说可能并不难,但我只需要找出显示不同日期的列和今天的日期之间的年数。我不太确定我做错了什么。它给了我错误:ORA-01858:在需要数字的地方发现了一个非数字字符

这是查询

SELECT emp_lname || ', ' || emp_fname || ' ' || emp_initial AS "Employee Full Name", 
     emp_years, 
     TO_DATE('emp_hiredate','DD/MM/YYYY')  - SYSDATE AS YEARS
FROM emp

我会推荐 months_between():

select floor(months_between(sysdate, emp_hiredate) / 12)

你的直接问题,抛出错误的是:

TO_DATE('emp_hiredate','DD/MM/YYYY')

您告诉 TO_DATE 函数,字符串文字 'emp_hiredate' 是日期的字符串表示形式,格式为 'DD/MM/YYYY'。即:

字符串'em'将被解释为月份中的第几天; 字符串 'p' 应为 '/'; 字符串 '_h' 将被解释为月份; 字符串 'i' 应为 '/'; 字符串 'reda' 将被解释为 4 位数的年份; 它不知道 与 'te'.

有什么关系

我想你的意思是

TO_DATE(emp_hiredate,'DD/MM/YYYY')

请注意 emp_hiredate 而不是 括在引号中,因此表示“emp_hiredate 列的值”。

但请注意,函数 TO_DATE 接受字符串输入并将其转换为 _oracle 的 DATE 数据类型的内部二进制格式。所以这个 假设 emp_hiredate 是日期的 varchar2,字符串文字 表示 ,并且进一步说字符串文字 [=30=日期的 ] 表示 的格式由调用 TO_DATE 的第二个参数指定。如果是这样的话,你就有了严重的设计缺陷。日期应存储为 DATE,而不是 VARCHAR2。

如果emp_hiredate已经是DATE,那么你要的不是TO_DATE,而是TO_CHAR

TO_CHAR(emp_hiredate,'DD/MM/YYYY')

你需要回到SQL参考手册,研究一下TO_DATE和TO_CHAR的区别。另请阅读 this.