这是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年
要具体(不要依赖日期文字的默认解释(,使用DATE
或TO_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