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

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之间添加小数吗?

以上是关于查找今天日期和日期列之间的年长的主要内容,如果未能解决你的问题,请参考以下文章

如何计算今天日期和jquery datepicker之间的日期

查找日期之间的天数C# [重复]

如果它在两个不同的日期之间,如何选择今天的日期[重复]

用PHP计算日期和今天之间的天数[重复]

SQL 其中 datetime 列等于今天的日期?

查找与今天日期批次不匹配的文件