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年?

我如何告诉SQL,对于月间计算,现在是2009年

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

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

DATE需要YYYY-MM-DD文字。而CCD_ 5允许您指定要使用的文字模式。参见日期文字

ps:就我个人而言,我不喜欢使用依赖口语的日期文字,或2位数的年份参考

尝试使用TO_DATE(例如TO_DATE('01-JUL-2009', 'dd-MON-YYYY')(将字符串日期转换为实际日期

对于两位数的年份,您可以使用RR日期格式,因此00到49是当前世纪(50到99是下一个世纪(,因此:

TO_DATE('01-JUL-09', 'DD-MON-RR')

请参阅:http://docs.oracle.com/database/122/SQLRF/Format-Models.htm#GUID-6C75461E-2E18-4C35-9EB4-038A7E1C9C1F

此外,这有点超出了我的知识范围,但我认为您可以使用NLS_date_format将此日期格式设置为默认格式,因此请搜索该术语,例如

https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams122.htm#REFRN10119

最新更新