首页 > 解决方案 > Oracle SQL 认为是 1909 年,而不是 2009 年

问题描述

这是来自 Casteel 12c SQL 教科书的图 10-41。

这本书有一个在我本地 SQL 开发人员上运行的示例返回错误的年数,因为它认为查询是针对 1909 年,而不是 2009 年。

select empno, lname, fname,hiredate,
    ROUND(MONTHS_BETWEEN(hiredate, '01-JUL-09')/12,2) "Years",
    case
        when (months_between('01-JUL-09', hiredate)/12) < 4 then 'Level 1'
        when (months_between('01-JUL-09', hiredate)/12) < 8 then 'Level 2'
        when (months_between('01-JUL-09', hiredate)/12) < 11 then 'Level 3'
        when (months_between('01-JUL-09', hiredate)/12) < 15 then 'Level 4'
        else 'Level 5'
    end "Retire Level"
from employees;

返回范围为 82 到 89 年(到小数点后 2 位),但在教科书中,它显示的返回值范围为 10 到 17 年,因为它正确地计算了 2009 年。

所以我将其更改为2009但得到相同的结果:

select empno, lname, fname,hiredate,
    ROUND(MONTHS_BETWEEN(hiredate, '01-JUL-2009')/12,2) "Years",
    case
        when (months_between('01-JUL-2009', hiredate)/12) < 4 then 'Level 1'
        when (months_between('01-JUL-2009', hiredate)/12) < 8 then 'Level 2'
        when (months_between('01-JUL-2009', hiredate)/12) < 11 then 'Level 3'
        when (months_between('01-JUL-2009', hiredate)/12) < 15 then 'Level 4'
        else 'Level 5'
    end "Retire Level"
from employees;

我如何告诉 SQL 是 2009 年的months_between 计算?

标签: sqloracle

解决方案


我如何告诉 SQL 是 2009 年的months_between 计算?

具体(不要依赖日期文字的默认解释),使用DATETO_DATE()例如

DATE '2009-07-01'
TO_DATE('01-JUL-2009','dd-mmm-yyyyy')

DATE需要 YYYY-MM-DD 文字。而TO_DATE()允许您指定要使用的文字模式。请参阅日期文字

ps:我个人不喜欢使用口语相关的日期文字,或 2 位数的年份参考


推荐阅读