查找今天日期和日期列之间的年长
Posted
技术标签:
【中文标题】查找今天日期和日期列之间的年长【英文标题】:Finding the length of years between todays date and a column of dates 【发布时间】:2020-12-14 16:20:39 【问题描述】:我是 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
【问题讨论】:
你能说清楚两个日期之间的“年”是什么意思吗? 【参考方案1】:您的直接问题,引发错误的是:
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,一个日期的字符串文字representation,并且进一步说一个日期的字符串文字representation 在调用 TO_DATE 的第二个参数指定的格式。如果是这种情况,则说明您存在严重的设计缺陷。日期应存储为 DATE,而不是 VARCHAR2。
如果emp_hiredate已经是一个DATE,那么你想要的不是TO_DATE,而是TO_CHAR
TO_CHAR(emp_hiredate,'DD/MM/YYYY')
您需要回到 SQL 参考手册并研究 TO_DATE 和 TO_CHAR 之间的区别。另请阅读this。
【讨论】:
【参考方案2】:我会推荐months_between()
:
select floor(months_between(sysdate, emp_hiredate) / 12)
【讨论】:
太好了,可以在months_between之间添加小数吗?以上是关于查找今天日期和日期列之间的年长的主要内容,如果未能解决你的问题,请参考以下文章